﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using produccion.reportes;
using System.Windows.Controls.Primitives;
using System.Threading;
using System.Globalization;
using System.Collections;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmEntradaDeMateriaPrima.xaml
    /// </summary>
    public partial class FrmEntradaDeMateriaPrima : Window
    {
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral
        
        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtEntradaMateriales;//FJRF - Para la entrada de materiales
        DataRow DrEntradaMateriales;//FJRF - Para la entrada de materiales
        //DataSet DsEntradaMateriales;//FJRF - Para la entrada de materiales

        String StrNroPedidoActual, StrNroPedidoAnterior, StrCodigoReferenciaActual, StrCodigoReferenciaAnterior;//FJRF - Para el numero de pedido seleccionado
        String StrTipoEntrada, StrTipo;

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string strTituloVentana = "ENTRADA DE MATERIAS PRIMAS" + " - Usuario:" + MDOgeneral.usuario + " - [FrmEntradaDeMateriaPrima]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana

            TxtNombreMateriaPrima.Style = null;//FJRF - Quitamos cualquier estilo que tenga...pero en especial el enter automatico que no se controla
            TxtBuscarMaterialDelPedidoSeleccionado.Style = null;//FJRF - Quitamos cualquier estilo que tenga...pero en especial el enter automatico que no se controla
            
            #region FJRF - CargaInicialDeLosCombos
            //FJRF - CARGAMOS EL CODIGO DEL PROVEEDOR POR APARTE
            StrConsulta = "SELECT CODPRV_PRV, NOMPRV_PRV FROM MAEPRVP ORDER BY NOMPRV_PRV";//FJRF - Armamos la consulta
            CargarCombo(CboCodigoProveedor, StrConsulta, "CODPRV_PRV", "CODPRV_PRV");//FJRF - Cargamos el combo

            //FJRF - CARGAMOS EL NOMBRE DEL PROVEEDOR POR APARTE
            CargarCombo(CboNombreProveedor, StrConsulta, "CODPRV_PRV", "NOMPRV_PRV");//FJRF - Cargamos el combo con la misma consulta anterior

            //FJRF - CARGAMOS LOS ALMACENES
            StrConsulta = "SELECT CODALM_ALM, NOMALM_ALM FROM MAEALMP ORDER BY NOMALM_ALM";//FJRF - Armamos la consulta
            CargarCombo(CboAlmecenes, StrConsulta, "CODALM_ALM", "NOMALM_ALM");//FJRF - Cargamos el combo
            CboAlmecenes.SelectedIndex = 0;//FJRF - ponemos el combo en la primera posición

            CboTipo.SelectedIndex = 0;//FJRF - Ponemos el combo en la primera posición
            #endregion

            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            CboTipo.Style = null;//FJRF - Le quitamos el estilo para poder manipular el foco del objeto
            TxtNumeroConsecutivo.Style = null;//FJRF - Le quitamos el estilo para poder manipular el foco del objeto
            //DtpFechaEntrada.Style = null;//FJRF - Le quitamos el estilo para poder manipular el foco del objeto
            CboAlmecenes.Style = null;//FJRF - Le quitamos el estilo para poder manipular el foco del objeto
            CboCodigoProveedor.Style = null;//FJRF - Le quitamos el estilo para poder manipular el foco del objeto
            CboNombreProveedor.Style = null;//FJRF - Le quitamos el estilo para poder manipular el foco del objeto
            TxtDocumentoReferencia.Style = null;//FJRF - Le quitamos el estilo para poder manipular el foco del objeto

            DtpFechaEntrada.DisplayDateStart = MDOgeneral.DttFechaInicialDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas iniciales que debe mostrar
            DtpFechaEntrada.DisplayDateEnd = MDOgeneral.DttFechaFinalDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas finales que debe mostrar

            DtpFechaEntrada.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema

            CboCodigoProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
            CboNombreProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

            PttV_CrearEncabezadoEntradaMateriales();//FJRF - Creamos las columnas del grid Entrada Materiales
            
            DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;//FJRF - Inicializamos el grid para que empiece como nuevo

            TxtConcepto.Text = "";//FJRF - Ponemos un valor por defecto

            CboCodigoProveedor.Focus();//FJRF - Ponemos el foco en el codigo del proveedor
        }
        private void DtpFechaEntrada_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (DtpFechaEntrada.SelectedDate != null)//FJRF - Verificamos que la fecha no venga nula
            {
                MDOgeneral.DttFechaDigitadaPorusuario = DtpFechaEntrada.SelectedDate.Value;//FJRF - Extraemos ls fecha digitada por el usuario

                if (BtnGuardar.IsEnabled == true)//FJRF - Si el grabar esta habilitado hacemos la validacion
                {
                    #region FJRF - ValidamosFechaDigitada
                    if (MDOgeneral.DttFechaDigitadaPorusuario < MDOgeneral.DttFechaInicialDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada es menor a la fecha minima permitida y si lo es hacemos lo siguiente
                    {
                        Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToLongDateString() + " ] no puede ser inferior a la fecha minima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaInicialDeValidacionEnElSistema.ToLongDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
                        DtpFechaEntrada.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
                    }
                    else//FJRF - Si no es menor la fecha entonces hacemos lo siguiente
                    {
                        if (MDOgeneral.DttFechaDigitadaPorusuario > MDOgeneral.DttFechaFinalDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada el mayor a la fecha maxima permitida y si lo es hacemos lo siguiente
                        {
                            Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToLongDateString() + " ] no puede ser superior a la fecha maxima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaFinalDeValidacionEnElSistema.ToLongDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
                            DtpFechaEntrada.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
                        }
                    }
                    #endregion
                }
                CboAlmecenes.Focus();
            }
        }
        protected void PttV_CrearEncabezadoEntradaMateriales()
        {
            try
            {
                DtEntradaMateriales = new DataTable("DtEntradaMateriales");
                //FJRF - CREAMOS LAS COLUMNAS PARA LA ENTRADA DE MATERIALES
                DtEntradaMateriales.Columns.Add("CODIGOMATERIAL", System.Type.GetType("System.String"));//FJRF - Creamos la columna del mismo tipo de la base de datos
                DtEntradaMateriales.Columns.Add("NOMBREMATERIAL", System.Type.GetType("System.String"));//FJRF - Creamos la columna del mismo tipo de la base de datos
                DtEntradaMateriales.Columns.Add("CODIGOUNIDAD", System.Type.GetType("System.String"));//FJRF - Creamos la columna del mismo tipo de la base de datos
                DtEntradaMateriales.Columns.Add("NOMBREUNIDAD", System.Type.GetType("System.String"));//FJRF - Creamos la columna del mismo tipo de la base de datos
                DtEntradaMateriales.Columns.Add("CANTIDAD", System.Type.GetType("System.Double"));//FJRF - Creamos la columna del mismo tipo de la base de datos
                DtEntradaMateriales.Columns.Add("COSTO", System.Type.GetType("System.Double"));//FJRF - Creamos la columna del mismo tipo de la base de datos
                DtEntradaMateriales.Columns.Add("SUBTOTAL", System.Type.GetType("System.Double"));//FJRF - Creamos la columna del mismo tipo de la base de datos
            }
            catch (DataException e)
            {
                // Process exception and return.
                Console.WriteLine("Exception of type {0} occurred.",
                    e.GetType());
            }

        }
        public FrmEntradaDeMateriaPrima()
        {
            InitializeComponent();
        }
        private void PrivVCargarGrid()
        {
            if (CboCodigoProveedor.Visibility == Visibility.Visible && CboNombreProveedor.Visibility == Visibility.Visible)//FJRF - Si los combos estan visibles hacer lo siguiente
            {
                #region LimpiamosLosGridSiCambianDeProveedor
                if (DtgPedidos.Items.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                {
                    DtgPedidos.ItemsSource = null;//FJRF - Desvinculamos el objeto
                    DtgPedidos.Items.Clear();//FJRF - Limpiamos el grid de pedidos
                }
                if (DtgMateriales.Items.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                {
                    DtgMateriales.ItemsSource = null;//FJRF - Desvinculamos el objeto
                    DtgMateriales.Items.Clear();//FJRF - Limpiamos el grid de materiales
                }
                if (DtEntradaMateriales.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                {
                    DtEntradaMateriales.Rows.Clear();//FJRF - Limpiamos el grid de entradas de materiales
                    DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;//FJRF - Refrescamos la vista
                }
                #endregion

                if (TxtNumeroConsecutivo.Text != "")//FJRF - Validamos que tenga datos el consecutivo
                {
                    if (CboCodigoProveedor.SelectedValue != null)//FJRF - Si hay un proveedor seleccionado hacemos lo siguiente
                    {
                        StrConsulta = "SELECT ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "NROPED_EPP AS NRO, FECPED_EPP AS FECHA, FECENT_EPP AS ENTREGA ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "FROM encpprp, VIS_PEDPEN ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE CODPRV_EPP = '" + CboCodigoProveedor.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND ESTPED_EPP = 'P' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODPRV_EPP = CODIGOPROVEEDOR ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND NROPED_EPP = NUMEROPEDIDO ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "GROUP BY NROPED_EPP, FECPED_EPP, FECENT_EPP ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "ORDER BY  NROPED_EPP";//FJRF - Armamos la consulta

                        DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos
                        DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

                        DtgPedidos.ItemsSource = DtConsulta.DefaultView;//FJRF - Traemos la tabla por defecto
                    }
                }
            }
        }
        private void DtgPedidos_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            //Style MyStyleTransparent = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
            //MyStyleTransparent.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent));//FJRF - Decimos que el texto se ponga transparente para que tome las propiedades del grid

            //(e.Column as DataGridTextColumn).CellStyle = MyStyleTransparent;//FJRF - Asignamos el estilo creado

            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgMateriales_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            //Style MyStyleTransparent = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
            //MyStyleTransparent.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent));//FJRF - Decimos que el texto se ponga transparente para que tome las propiedades del grid

            //(e.Column as DataGridTextColumn).CellStyle = MyStyleTransparent;//FJRF - Asignamos el estilo creado

            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "PEDIDO" || strNombreColumna == "RECIBIDO" || strNombreColumna == "DESCARTADO" || strNombreColumna == "PENDIENTE")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }

        //<ContentPresenter HorizontalAlignment="Right" VerticalAlignment="Center"/>
        private void DtgEntradaMateriaPrima_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            //Style MyStyleTransparent = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
            //MyStyleTransparent.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent));//FJRF - Decimos que el texto se ponga transparente para que tome las propiedades del grid

            //(e.Column as DataGridTextColumn).CellStyle = MyStyleTransparent;//FJRF - Asignamos el estilo creado

            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "CANTIDAD" || strNombreColumna == "COSTO" || strNombreColumna == "SUBTOTAL")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
            if (strNombreColumna == "CODIGOMATERIAL" || strNombreColumna == "NOMBREMATERIAL" || strNombreColumna == "CODIGOUNIDAD" || strNombreColumna == "NOMBREUNIDAD" || strNombreColumna == "SUBTOTAL")//FJRF - Si alguna de las columnas tiene estos nombres hacemos lo siguiente
            {
                e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            }
        }
        private void DtgPedidos_GotFocus(object sender, RoutedEventArgs e)
        {
            if (StrVerificamosSiSePuedeSeguir() == "SI")//FJRF - Si todos los datos estan bien para seguir hacemos lo siguiente
            {
                //FJRF - No hacemos nada por el momento
            }
            else//FJRF - Si no se puede grabar hacemos lo siguiente
            {
                Msgbox("ADVERTENCIA !!!", StrVerificamosSiSePuedeSeguir(), MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Informamos el motivo de porque no se puede seguir
            }
        }
        private void DtgPedidos_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (DtgPedidos.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
                    return;//FJRF - Nos salimos

                DataRowView dr = DtgPedidos.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                StrNroPedidoActual = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna cero nos traiga el dato de la fila seleccionada

                LblTituloPedidoSeleccionado.Content = "Pedido seleccionado";//FJRF - Limpiamos el pedido seleccionado
                LblNumeroPedidoSeleccionado.Content = StrNroPedidoActual;//FJRF - Enviamos el pedido seleccionado

                StrConsulta = "SELECT CODIGOREFERENCIA AS CODMAT,  NOMBREREREFENCIA AS MATERIAL,  CODIGOCOLOR AS CODCOL,  NOMBRECOLOR AS COLOR, CODIGOUNIDAD AS CODUNI, NOMBREUNIDAD AS UNIDAD,  PEDIDO,  RECIBIDO,  DESPACHADO AS DESCARTADO,  PENDIENTE ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM VIS_PEDPEN ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE NUMEROPEDIDO = '" + StrNroPedidoActual + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODIGOPROVEEDOR = '" + CboCodigoProveedor.SelectedValue + "' ";//FJRF - Armamos la consulta

                DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

                DtgMateriales.ItemsSource = DtConsulta.DefaultView;

                TxtBuscarMaterialDelPedidoSeleccionado.Text = "";//FJRF - Limpiamos el objeto
                if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos en la tabla hacemos lo siguiente
                {
                    TxtBuscarMaterialDelPedidoSeleccionado.Visibility = Visibility.Visible;//FJRF - Ponemos visible la ayuda de busqueda
                }
                else//FJRF - Si no hay datos en la tabla hacemos lo siguiente
                {
                    TxtBuscarMaterialDelPedidoSeleccionado.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible la ayuda de busqueda
                }

                if (StrNroPedidoActual == StrNroPedidoAnterior)//FJRF - Si hay perido repetido hacemos lo siguiente
                {
                    Msgbox("ADVERTENCIA", "Ya esta trabajando con el pedido: (" + StrNroPedidoActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);//FJRF - Informamos al usuario que existe un dato repetido
                }
                else//FJRF - Si no hay un pedido repetido hacemos lo siguiente
                {
                    DtEntradaMateriales.Rows.Clear();//FJRF - Limpiamos las filas
                    DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;//FJRF - Asignamos la entrada de materiales

                    StrNroPedidoAnterior = StrNroPedidoActual;//FJRF - Convertimos el pedido actual en anterior para una futura busqueda
                }

                if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos en la tabla hacemos lo siguiente
                {
                    DtgMateriales.Focus();
                    DtgMateriales.CurrentCell = new DataGridCellInfo(DtgMateriales.Items[0], DtgMateriales.Columns[0]);//FJRF - Decimos en que fila y columna vamos a trabajar
                }
                
                PttV_SumarCantidadYCosto();//FJRF - Sumamos la cantidad y costo ingresado
            }
            catch (Exception ex)//FJRF - Si pasa un error hacemos lo siguiente
            {
                MessageBox.Show(ex.Message);//FJRF - Mostramos el error en pantalla
            }
        }
        private void DtgMateriales_GotFocus(object sender, RoutedEventArgs e)
        {
            if (StrVerificamosSiSePuedeSeguir() == "SI")//FJRF - Si todos los datos estan bien para seguir hacemos lo siguiente
            {
                //FJRF - No hacemos nada por el momento
            }
            else//FJRF - Si no se puede grabar hacemos lo siguiente
            {
                Msgbox("ADVERTENCIA !!!", StrVerificamosSiSePuedeSeguir(), MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Informamos el motivo de porque no se puede seguir
            }
        }
        private void DtgMateriales_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            DependencyObject src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource);//FJRF - Creamos una dependencia del objeto [DOBLE CLICK DATAGRID OJO EXELENTE FUNCION PARA QUE NO TOME EL DESPLAZAMIENTO COMO UN CLIC]

            if (src.GetType() == typeof(ContentPresenter))//FJRF - Comprueba si el usuario hace doble clic en una fila de la cuadrícula de datos [ContentPresenter]
            {
                String StrCodigoReferencia, StrNombreReferencia, StrReferencia, StrColor, StrCodigoUnidad, StrNombreUnidad, StrNombreColor;//FJRF - Creamos las variables necesarias para los materiales que sean tipo string
                Double DblCosto = 0, DblCantidadPendiente = 1;//FJRF - Creamos las variables necesarias para los materiales que sean tipo numerico y las inicializamos
                try
                {
                    if (DtgMateriales.SelectedItem == null)//FJRF - Si no hay materiales seleccionados hacemos lo siguiente
                        return;//FJRF - Nos salimos

                    DataRowView dr = DtgMateriales.SelectedItem as DataRowView;//FJRF - Creamos un DataRowView con el item seleccionado
                    DataRow dr1 = dr.Row;//FJRF - Cargamos las filas que tenga

                    StrReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan
                    StrColor = Convert.ToString(dr1.ItemArray[2]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    StrNombreColor = Convert.ToString(dr1.ItemArray[3]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    StrCodigoReferencia = StrReferencia + StrColor;//FJRF - Se arma la referencia con la referencia del material mas el color
                    StrNombreReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    DblCantidadPendiente = Double.Parse(Convert.ToString(dr1.ItemArray[9]));//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    StrCodigoReferenciaActual = StrCodigoReferencia;//FJRF - Asignamos la referencia armada como referencia acutal

                    StrCodigoUnidad = Convert.ToString(dr1.ItemArray[4]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan
                    StrNombreUnidad = Convert.ToString(dr1.ItemArray[5]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan


                    DtConsulta = new DataTable();//FJRF - Creamos un nuevo manejador de consultas
                    StrConsulta = "SELECT CODMAT_MTP, NOMMAT_MAT, CODCOL_MTP, NOMCOL_COL, CODBAR_MTP, EXIMTP_MTP, CANSEP_MTP, FISICO_MTP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "FROM maemtp, MAEMAT, MAECOLP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "WHERE CODMAT_MAT = CODMAT_MTP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "AND CODCOL_COL = CODCOL_MTP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "AND CODMAT_MTP = '" + StrReferencia + "' AND CODCOL_MTP = '" + StrColor + "' ";//FJRF - Se arma la busqueda
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos consultados atravez de una funcion

                    if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtConsulta = new DataTable();//FJRF - Creamos un nuevo manejador de consultas
                        StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '99' AND CODMAT_PMP = '" + StrReferencia + "' AND CODCOL_PMP = '" + StrColor + "'";//FJRF - Se arma la busqueda
                        DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos consultados atravez de una funcion

                        if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                        {
                            DblCosto = Double.Parse(DtConsulta.Rows[0][0].ToString());//FJRF - Cargamos el costo
                        }
                        else//FJRF - Si la consulta no trae datos hacemos lo siguiente
                        {
                            DblCosto = 0;//FJRF - Ponemos el costo en cero
                        }

                        Boolean BooDatoEncontrado = false;//FJRF - Creamos una variable para saber si vamos a encontrar un dato y la cargamos por defecto en falso
                        if (DtgEntradaMateriaPrima.Items.Count > 0)//FJRF - Si la consulta tiene datos hacemos lo siguiente
                        {
                            foreach (var FilaGrid in DtgEntradaMateriaPrima.Items)//FJRF - Recorremos el grid
                            {
                                StrCodigoReferenciaAnterior = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGrid, 0);//FJRF - Extraemos la referencia anterior
                                if (String.IsNullOrEmpty(StrCodigoReferenciaAnterior) == false)//FJRF - Si la referencia tiene datos hacemos lo siguiente
                                {
                                    if (StrCodigoReferenciaActual == StrCodigoReferenciaAnterior)//FJRF - Si la refencia anterior es igual a la actual hacemos lo siguiente
                                    {
                                        BooDatoEncontrado = true;//FJRF - Informamos al sistema q si encontramos un dato
                                    }
                                }
                            }
                        }

                        if (BooDatoEncontrado == true)//FJRF - Si encontramos un dato hacemos lo siguiente
                        {
                            Msgbox("ADVERTENCIA", "Ya esta asignado el material : (" + StrCodigoReferenciaActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);//FJRF - Informamos al usuario
                        }
                        else//FJRF - Si no encontramos ningun dato hacemos lo siguiente
                        {
                            DrEntradaMateriales = DtEntradaMateriales.NewRow();//FJRF - Creamos una nueva fila

                            DrEntradaMateriales["CODIGOMATERIAL"] = StrCodigoReferencia;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["NOMBREMATERIAL"] = StrNombreReferencia + " - " + StrNombreColor;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["CODIGOUNIDAD"] = StrCodigoUnidad;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["NOMBREUNIDAD"] = StrNombreUnidad;//FJRF - Asignamos los datos a la nueva fila

                            //DrEntradaMateriales["CANTIDAD"] = DblCantidadPendiente;
                            DrEntradaMateriales["CANTIDAD"] = 0;//FJRF - Se quita la cantidad a peticion de Diana Londoño el dia [26/01/2015]

                            DrEntradaMateriales["COSTO"] = DblCosto;//FJRF - Asignamos los datos a la nueva fila
                            //DrEntradaMateriales["SUBTOTAL"] = DblCantidadPendiente * DblCosto;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["SUBTOTAL"] = 0;//FJRF - Asignamos los datos a la nueva fila

                            DtEntradaMateriales.Rows.Add(DrEntradaMateriales);//FJRF - Adicionamos la nueva fila a la tabla

                            DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;//FJRF - Asignamos la tabla al grid

                            DtgEntradaMateriaPrima.Focus();//FJRF - Le enviamos el foco al objeto

                            int IntFilaIndexada = DtgEntradaMateriaPrima.Items.Count - 1;//FJRF - Capturamos la fila indexada que el la ultima que se pone en el grid
                            SelectCellByIndex(DtgEntradaMateriaPrima, IntFilaIndexada, 4);//FJRF - Le decimos cual es la nueva posicion
                        }
                    }
                    else//FJRF - Si la consulta no trae datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "La referencia '" + StrReferencia + "' en color '" + StrReferencia + "' no se puede agregar porque no existe.", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                    }
                }
                catch (Exception ex)//FJRF - Si se presenta un error hacemos lo siguiente
                {
                    MessageBox.Show(ex.Message);//FJRF - Enviamos un mensaje al usuario
                }
            }
        }

        private void PrivV_BuscarMateriaPrima()
        {
            String StrDatoConsultado = "";//FJRF - variable para guardar datos consultados
            try
            {
                #region FJRF - InvocarBusquedaRetornandoCodigoYNombre

                //FJRF - Variables
                String StrDato = "", StrRetornoCodigo = "", StrRetornoNombre = "";

                StrDato = TxtNombreMateriaPrima.Text;
                TxtNombreMateriaPrima.Text = "";

                //FJRF - Clase de busquedas
                FRMBuscarCol FrmColores = new FRMBuscarCol();

                //FJRF - Enviamos los parametros
                FrmColores.EsReferencia = false;
                FrmColores.RequiereColor = true;
                FrmColores.txtNombre.Text = StrDato.Trim().ToUpper();
                FrmColores.txtNombre.Focus();
                FrmColores.txtNombre.Select(FrmColores.txtNombre.Text.Length, 0);

                //FJRF - Llamamos la ventana de busquedas
                FrmColores.ShowDialog();

                //FJRF - Retornamos los valores
                if (!String.IsNullOrEmpty(FrmColores.Retorno))
                {
                    StrRetornoCodigo = MdoGeneral.PasarCadenaYRetornarCodigoONombre(FrmColores.Retorno, "-", "Codigo");
                    StrRetornoNombre = MdoGeneral.PasarCadenaYRetornarCodigoONombre(FrmColores.Retorno, "-", "Nombre");

                    StrCodigoReferenciaActual = StrRetornoCodigo;

                    #region FJRF - AgregamosLosDatos

                    if (StrRetornoCodigo == "" && StrRetornoNombre == "")//FJRF - Si no hay codigo ni nombre hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "No se retornaron datos para el material: (" + StrDato + ")", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Informamos al usuario que el proceso se cancela
                    }
                    else//FJRF - Si hay datos hacemos lo siguiente
                    {
                        Boolean BooDatoEncontrado = false;
                        if (DtgEntradaMateriaPrima.Items.Count > 0)
                        {
                            foreach (var FilaGrid in DtgEntradaMateriaPrima.Items)
                            {
                                StrCodigoReferenciaAnterior = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGrid, 0);
                                if (String.IsNullOrEmpty(StrCodigoReferenciaAnterior) == false)
                                {
                                    if (StrCodigoReferenciaActual == StrCodigoReferenciaAnterior)
                                    {
                                        BooDatoEncontrado = true;
                                    }
                                }
                            }
                        }

                        if (BooDatoEncontrado == true)
                        {
                            Msgbox("ADVERTENCIA", "Ya esta asignado el material : (" + StrCodigoReferenciaActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        }
                        else
                        {
                            #region FJRF - AveriguamosElCosto
                            Double DblCosto;

                            DtConsulta = new DataTable();
                            StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '00' AND CODMAT_PMP = '" + StrRetornoCodigo.Substring(0, 6) + "' AND CODCOL_PMP = '" + StrRetornoCodigo.Substring(6, 4) + "'";
                            DtConsulta = MdoGeneral.consulta(StrConsulta);

                            if (DtConsulta.Rows.Count > 0)
                            {
                                StrDatoConsultado = DtConsulta.Rows[0][0].ToString().Replace(",", "");
                                DblCosto = Double.Parse(StrDatoConsultado);
                            }
                            else
                            {
                                DblCosto = 0;
                            }
                            #endregion

                            #region AveriguamosUnidadDeCompra
                            String StrCodigoUnidad, StrNombreUnidad;

                            DtConsulta = new DataTable();
                            StrConsulta = "SELECT UNICOM_MAT AS CODIGOUNIDAD, NOMUNI_EUN AS NOMBREUNIDAD FROM MAEMAT, encunip WHERE UNICOM_MAT = CODUNI_EUN AND CODMAT_MAT = '" + StrRetornoCodigo.Substring(0, 6) + "' ";
                            DtConsulta = MdoGeneral.consulta(StrConsulta);

                            if (DtConsulta.Rows.Count > 0)
                            {
                                StrCodigoUnidad = DtConsulta.Rows[0][0].ToString();
                                StrNombreUnidad = DtConsulta.Rows[0][1].ToString();
                            }
                            else
                            {
                                StrCodigoUnidad = "";
                                StrNombreUnidad = "";
                            }
                            #endregion

                            #region AveriguamosElColor
                            String StrColorMateriaPrima = "";//FJRF - Variable que contiene el nombre del color de la materia prima, se inicializa vacio

                            DtConsulta = new DataTable();
                            StrConsulta = "SELECT NOMCOL_COL FROM MAECOLP WHERE CODCOL_COL = '" + StrRetornoCodigo.Substring(6, 4) + "'";
                            DtConsulta = MdoGeneral.consulta(StrConsulta);

                            if (DtConsulta.Rows.Count > 0)
                            {
                                StrColorMateriaPrima = DtConsulta.Rows[0][0].ToString();
                            }
                            else
                            {
                                StrColorMateriaPrima = "Color no encontrado";
                            }
                            #endregion

                            DrEntradaMateriales = DtEntradaMateriales.NewRow();

                            DrEntradaMateriales["CODIGOMATERIAL"] = StrRetornoCodigo;
                            DrEntradaMateriales["NOMBREMATERIAL"] = StrRetornoNombre + " - " + StrColorMateriaPrima;
                            DrEntradaMateriales["CODIGOUNIDAD"] = StrCodigoUnidad;
                            DrEntradaMateriales["NOMBREUNIDAD"] = StrNombreUnidad;
                            DrEntradaMateriales["CANTIDAD"] = 0;
                            DrEntradaMateriales["COSTO"] = DblCosto;
                            DrEntradaMateriales["SUBTOTAL"] = 0;

                            DtEntradaMateriales.Rows.Add(DrEntradaMateriales);

                            DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;

                            DtgEntradaMateriaPrima.Focus();//FJRF - Le enviamos el foco al objeto
                            int IntFilaIndexada = DtgEntradaMateriaPrima.Items.Count - 1;//FJRF - Capturamos la fila indexada que el la ultima que se pone en el grid
                            SelectCellByIndex(DtgEntradaMateriaPrima, IntFilaIndexada, 4);//FJRF - Le decimos cual es la nueva posicion
                        }
                    }

                    TxtBuscarMaterialDelPedidoSeleccionado.Text = "";//FJRF - Limpiamos la busqueda anterior

                    #endregion
                }
                else
                {
                    for (int k = 0; k < FrmColores.dtRetorno.Rows.Count; k++)//FJRF - Recorremos los datos que retorna
                    {
                        String StrDatoExtraidoDeLoRetornado = FrmColores.dtRetorno.Rows[k][0].ToString();//FJRF - Extraemos el que se retorno en el formulario que trae las materias primas con los colores y lo trae en la columna cero [0] de la fila que se esta recorriendo
                        
                        StrRetornoCodigo = StrDatoExtraidoDeLoRetornado;//FJRF - Asignamos el codigo que ya llega solo
                        StrRetornoNombre = MdoGeneral.StrRetornarUnSoloCampo("NOMMAT_MAT", "NombreMateriaPrima", "MAEMAT", "CODMAT_MAT = '" + StrDatoExtraidoDeLoRetornado.Trim().Substring(0, 6) + "' ");//FJRF - Buscamos el nombre del material

                        #region FJRF - AgregamosLosDatos

                        if (StrRetornoCodigo == "" && StrRetornoNombre == "")//FJRF - Si no hay codigo ni nombre hacemos lo siguiente
                        {
                            Msgbox("PROCESO CANCELADO", "No se retornaron datos para el material: (" + StrDato + ")", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Informamos al usuario que el proceso se cancela
                        }
                        else//FJRF - Si hay datos hacemos lo siguiente
                        {
                            Boolean BooDatoEncontrado = false;
                            if (DtgEntradaMateriaPrima.Items.Count > 0)
                            {
                                foreach (var FilaGrid in DtgEntradaMateriaPrima.Items)
                                {
                                    StrCodigoReferenciaAnterior = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGrid, 0);
                                    if (String.IsNullOrEmpty(StrCodigoReferenciaAnterior) == false)
                                    {
                                        if (StrCodigoReferenciaActual == StrCodigoReferenciaAnterior)
                                        {
                                            BooDatoEncontrado = true;
                                        }
                                    }
                                }
                            }

                            if (BooDatoEncontrado == true)
                            {
                                Msgbox("ADVERTENCIA", "Ya esta asignado el material : (" + StrCodigoReferenciaActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            }
                            else
                            {
                                #region FJRF - AveriguamosElCosto
                                Double DblCosto;

                                DtConsulta = new DataTable();
                                StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '00' AND CODMAT_PMP = '" + StrRetornoCodigo.Substring(0, 6) + "' AND CODCOL_PMP = '" + StrRetornoCodigo.Substring(6, 4) + "'";
                                DtConsulta = MdoGeneral.consulta(StrConsulta);

                                if (DtConsulta.Rows.Count > 0)
                                {
                                    StrDatoConsultado = DtConsulta.Rows[0][0].ToString().Replace(",", "");
                                    DblCosto = Double.Parse(StrDatoConsultado);
                                }
                                else
                                {
                                    DblCosto = 0;
                                }
                                #endregion

                                #region AveriguamosUnidadDeCompra
                                String StrCodigoUnidad, StrNombreUnidad;

                                DtConsulta = new DataTable();
                                StrConsulta = "SELECT UNICOM_MAT AS CODIGOUNIDAD, NOMUNI_EUN AS NOMBREUNIDAD FROM MAEMAT, encunip WHERE UNICOM_MAT = CODUNI_EUN AND CODMAT_MAT = '" + StrRetornoCodigo.Substring(0, 6) + "' ";
                                DtConsulta = MdoGeneral.consulta(StrConsulta);

                                if (DtConsulta.Rows.Count > 0)
                                {
                                    StrCodigoUnidad = DtConsulta.Rows[0][0].ToString();
                                    StrNombreUnidad = DtConsulta.Rows[0][1].ToString();
                                }
                                else
                                {
                                    StrCodigoUnidad = "";
                                    StrNombreUnidad = "";
                                }
                                #endregion

                                #region AveriguamosElColor
                                String StrColorMateriaPrima = "";//FJRF - Variable que contiene el nombre del color de la materia prima, se inicializa vacio

                                DtConsulta = new DataTable();
                                StrConsulta = "SELECT NOMCOL_COL FROM MAECOLP WHERE CODCOL_COL = '" + StrRetornoCodigo.Substring(6, 4) + "'";
                                DtConsulta = MdoGeneral.consulta(StrConsulta);

                                if (DtConsulta.Rows.Count > 0)
                                {
                                    StrColorMateriaPrima = DtConsulta.Rows[0][0].ToString();
                                }
                                else
                                {
                                    StrColorMateriaPrima = "Color no encontrado";
                                }
                                #endregion

                                DrEntradaMateriales = DtEntradaMateriales.NewRow();

                                DrEntradaMateriales["CODIGOMATERIAL"] = StrRetornoCodigo;
                                DrEntradaMateriales["NOMBREMATERIAL"] = StrRetornoNombre + " - " + StrColorMateriaPrima;
                                DrEntradaMateriales["CODIGOUNIDAD"] = StrCodigoUnidad;
                                DrEntradaMateriales["NOMBREUNIDAD"] = StrNombreUnidad;
                                DrEntradaMateriales["CANTIDAD"] = 0;
                                DrEntradaMateriales["COSTO"] = DblCosto;
                                DrEntradaMateriales["SUBTOTAL"] = 0;

                                DtEntradaMateriales.Rows.Add(DrEntradaMateriales);

                                DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;
                            }
                        }
                        #endregion
                    }

                    TxtBuscarMaterialDelPedidoSeleccionado.Text = "";//FJRF - Limpiamos la busqueda anterior

                    if (DtgEntradaMateriaPrima.Items.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtgEntradaMateriaPrima.Focus();//FJRF - Le enviamos el foco al objeto
                        int IntFilaIndexada = DtgEntradaMateriaPrima.Items.Count - 1;//FJRF - Capturamos la fila indexada que el la ultima que se pone en el grid
                        SelectCellByIndex(DtgEntradaMateriaPrima, IntFilaIndexada, 4);//FJRF - Le decimos cual es la nueva posicion
                    }
                }
                #endregion
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private void DtgEntradaMateriaPrima_GotFocus(object sender, RoutedEventArgs e)
        {
            if (StrVerificamosSiSePuedeSeguir() == "SI")//FJRF - Si todos los datos estan bien para seguir hacemos lo siguiente
            {
                //FJRF - No hacemos nada por el momento
            }
            else//FJRF - Si no se puede grabar hacemos lo siguiente
            {
                Msgbox("ADVERTENCIA !!!", StrVerificamosSiSePuedeSeguir(), MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Informamos el motivo de porque no se puede seguir
            }
        }
        private void DtgEntradaMateriaPrima_KeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            String StrDato = "";
            int IntColumnaSeleccionada = IntColumnaIndexada;
            int IntFilaSeleccionada = IntFilaIndexada;
            if (e.Key == Key.F2 && IntColumnaSeleccionada == 0)
            {
                //FJRF - Variables
                String StrRetornoCodigo = "", StrRetornoNombre = "";
                //FJRF - Busqueda del dato digitado
                DataGridCell cell = DataGridHelper.GetCell(DtgEntradaMateriaPrima, DtgEntradaMateriaPrima.SelectedIndex, 0);
                StrDato = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();
                if (StrDato.Trim() == "System.Windows.Controls.DataGridCell")
                    StrDato = "";

                cell.Content = "";//FJRF - Borramos el valor de la celda

                #region InvocarBusquedaRetornandoCodigoYNombre

                //FJRF - Clase de busquedas
                FRMBuscarCol f = new FRMBuscarCol();

                //FJRF - Enviamos los parametros
                f.EsReferencia = false;
                f.RequiereColor = true;
                f.txtNombre.Text = StrDato.Trim().ToUpper();
                f.txtNombre.Focus();
                f.txtNombre.Select(f.txtNombre.Text.Length, 0);

                //FJRF - Llamamos la ventana de busquedas
                f.ShowDialog();

                //FJRF - Retornamos los valores
                if (!String.IsNullOrEmpty(f.Retorno))
                {
                    StrRetornoCodigo = MdoGeneral.PasarCadenaYRetornarCodigoONombre(f.Retorno, "-", "Codigo");
                    StrRetornoNombre = MdoGeneral.PasarCadenaYRetornarCodigoONombre(f.Retorno, "-", "Nombre");

                    StrCodigoReferenciaActual = StrRetornoCodigo;
                }
                #endregion

                if (StrRetornoCodigo == "" && StrRetornoNombre == "")
                {
                    Msgbox("PROCESO CANCELADO", "No se retornaron datos para el material: (" + StrDato + ")", MessageBoxButton.OK, MessageBoxImage.Information);
                }
                else
                {
                    Boolean BooDatoEncontrado = false;
                    if (DtgEntradaMateriaPrima.Items.Count > 0)
                    {
                        foreach (var FilaGrid in DtgEntradaMateriaPrima.Items)
                        {
                            StrCodigoReferenciaAnterior = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGrid, 0);
                            if (String.IsNullOrEmpty(StrCodigoReferenciaAnterior) == false)
                            {
                                if (StrCodigoReferenciaActual == StrCodigoReferenciaAnterior)
                                {
                                    BooDatoEncontrado = true;
                                }
                            }
                        }
                    }

                    if (BooDatoEncontrado == true)
                    {
                        Msgbox("ADVERTENCIA", "Ya esta asignado el material : (" + StrCodigoReferenciaActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    }
                    else
                    {
                        #region AveriguamosElCosto
                        Double DblCosto;

                        DtConsulta = new DataTable();
                        StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '00' AND CODMAT_PMP = '" + StrRetornoCodigo.Substring(0, 6) + "' AND CODCOL_PMP = '" + StrRetornoCodigo.Substring(6, 4) + "'";
                        DtConsulta = MdoGeneral.consulta(StrConsulta);

                        if (DtConsulta.Rows.Count > 0)
                        {
                            DblCosto = Double.Parse(DtConsulta.Rows[0][0].ToString());
                        }
                        else
                        {
                            DblCosto = 0;
                        }
                        #endregion

                        #region AveriguamosUnidadDeCompra
                        String StrCodigoUnidad, StrNombreUnidad;

                        DtConsulta = new DataTable();
                        StrConsulta = "SELECT UNICOM_MAT AS CODIGOUNIDAD, NOMUNI_EUN AS NOMBREUNIDAD FROM MAEMAT, encunip WHERE UNICOM_MAT = CODUNI_EUN AND CODMAT_MAT = '" + StrRetornoCodigo.Substring(0, 6) + "' ";
                        DtConsulta = MdoGeneral.consulta(StrConsulta);

                        if (DtConsulta.Rows.Count > 0)
                        {
                            StrCodigoUnidad = DtConsulta.Rows[0][0].ToString();
                            StrNombreUnidad = DtConsulta.Rows[0][1].ToString();
                        }
                        else
                        {
                            StrCodigoUnidad = "";
                            StrNombreUnidad = "";
                        }
                        #endregion

                        DrEntradaMateriales = DtEntradaMateriales.NewRow();

                        DrEntradaMateriales["CODIGOMATERIAL"] = StrRetornoCodigo;
                        DrEntradaMateriales["NOMBREMATERIAL"] = StrRetornoNombre;
                        DrEntradaMateriales["CODIGOUNIDAD"] = StrCodigoUnidad;
                        DrEntradaMateriales["NOMBREUNIDAD"] = StrNombreUnidad;
                        DrEntradaMateriales["CANTIDAD"] = 1;
                        DrEntradaMateriales["COSTO"] = DblCosto;
                        DrEntradaMateriales["SUBTOTAL"] = 1 * DblCosto;

                        DtEntradaMateriales.Rows.Add(DrEntradaMateriales);
                    }
                }
            }
        }

        private void DtgEntradaMateriaPrima_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales;//FJRF Creamos las variables que necesitamos para el proceso actual

            IntCantidadRegistros = DtgEntradaMateriaPrima.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid

            IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
            IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una

            String StrDato = "";//FJRF - Creamos una variable para manejar datos temporales

            #region FJRF - CodigoParaPasarElFocoDentroDelGrid
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                if (IntColumnaIndexada == 0)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                {
                    e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                    SelectCellByIndex(DtgEntradaMateriaPrima, IntFilaIndexada, 4);//FJRF - Le decimos cual es la nueva posicion
                }
                else//FJRF - si no es la columna del codigo hacemos lo siguiente
                {
                    if ((IntColumnaIndexada == 4))
                    {
                        if (IntFilaIndexada == IntRegistrosActuales)
                        {
                            if (TxtBuscarMaterialDelPedidoSeleccionado.Visibility == Visibility.Visible)//FJRF - Si el objeto esta visible hacer lo siguiente
                            {
                                TxtBuscarMaterialDelPedidoSeleccionado.Text = "";//FJRF - Limpiamos la busqueda anterior
                                TxtBuscarMaterialDelPedidoSeleccionado.Focus();//FJRF - Envia el foco a donde se selecciona la materia prima
                            }
                            else//FJRF - Sino esta visible es posible que sea porque es una devolucion entonces hacemos lo siguiente
                            {
                                TxtNombreMateriaPrima.Text = "";//FJRF - Limpiamos la busqueda anterior
                                TxtNombreMateriaPrima.Focus();//FJRF - Envia el foco a donde se selecciona la materia prima
                            }
                        }
                        else
                        {
                            if (IntFilaIndexada < IntRegistrosActuales)
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgEntradaMateriaPrima, IntFilaActual, 0);//FJRF - Le decimos cual es la nueva posicion
                            }
                        }
                    }
                    else
                    {
                        if ((IntColumnaIndexada == 5))
                        {
                            if (TxtBuscarMaterialDelPedidoSeleccionado.Visibility == Visibility.Visible)//FJRF - Si el objeto esta visible hacer lo siguiente
                            {
                                TxtBuscarMaterialDelPedidoSeleccionado.Text = "";//FJRF - Limpiamos la busqueda anterior
                                TxtBuscarMaterialDelPedidoSeleccionado.Focus();//FJRF - Envia el foco a donde se selecciona la materia prima
                            }
                            else//FJRF - Sino esta visible es posible que sea porque es una devolucion entonces hacemos lo siguiente
                            {
                                TxtNombreMateriaPrima.Text = "";//FJRF - Limpiamos la busqueda anterior
                                TxtNombreMateriaPrima.Focus();//FJRF - Envia el foco a donde se selecciona la materia prima
                            }
                        }
                        else
                        {
                            e.Handled = true;
                            elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                        }
                    }
                    if (IntColumnaIndexada == 4 || IntColumnaIndexada == 5)//FJRF - Si la columna es igual a cantidad o costo hacemos lo siguiente
                    {
                        Double DblCantidad = 0, DblCosto = 0, DblSubTotal = 0;//FJRF - Creamos variables para el manejo de las cantidades y de los costos

                        #region FJRF - AveriguamosLaCantidad
                        DataGridCell cell = DataGridHelper.GetCell(DtgEntradaMateriaPrima, IntFilaIndexada, 4);
                        StrDato = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();
                        if (StrDato.Trim() == "System.Windows.Controls.DataGridCell")
                            StrDato = "0";

                        DblCantidad = Double.Parse(StrDato.Replace(",", ""));
                        #endregion

                        #region FJRF - AveriguamosElCosto
                        cell = DataGridHelper.GetCell(DtgEntradaMateriaPrima, IntFilaIndexada, 5);
                        StrDato = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();
                        if (StrDato.Trim() == "System.Windows.Controls.DataGridCell")
                            StrDato = "0";

                        DblCosto = Double.Parse(StrDato.Replace(",", ""));
                        #endregion

                        DblSubTotal = DblCantidad * DblCosto;//FJRF - Averiguamos el subtotal

                        DtEntradaMateriales.Rows[IntFilaIndexada][6] = DblSubTotal;//FJRF - Asignamos el subtotal al datatable que maneja los datos

                        if (IntColumnaIndexada == 4 && DblCosto == 0)
                        {
                            e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                            SelectCellByIndex(DtgEntradaMateriaPrima, IntFilaIndexada, 5);//FJRF - Le decimos cual es la nueva posicion
                        }

                        DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;

                        PttV_SumarCantidadYCosto();//FJRF - Sumamos la cantidad y costo ingresado
                    }
                }
            }
            #endregion
        }
        protected void PttV_SumarCantidadYCosto()
        {
            if (DtEntradaMateriales == null)//FJRF - Si viene nulo hacemos lo siguiente
            {
                LblCantidad.Content = "0";//FJRF - Ponemos un valos por defecto
                LblCosto.Content = "0";//FJRF - Ponemos un valos por defecto
            }
            else//FJRF - Si esta cargado con algo hacemos lo siguiente
            {
                if (DtEntradaMateriales.Rows.Count > 0)//FJRF - Si tiene datos hacemos lo siguiente
                {
                    Double DblSumarCantidad = 0, DblSumarCosto = 0, DblTotalCosto = 0, DblTotalCantidad = 0;//FJRF - Creamos las variables numericas para el proceso
                    String StrCodigoMaterialASumar = "", StrCodigoColorASumar = "";//FJRF - Creamos las que tendran la informacion del material ingresado solo por si se necesita

                    for (int IntFilaActualASumar = 0; IntFilaActualASumar < DtEntradaMateriales.Rows.Count; IntFilaActualASumar++)//FJRF - Recorremos la informacion encontrada
                    {
                        DblSumarCantidad = Double.Parse(DtEntradaMateriales.Rows[IntFilaActualASumar][4].ToString().Trim());//FJRF - Extraemos la cantidad
                        if (DblSumarCantidad > 0)//FJRF - Si la cantidad es mayor a cero hacemos lo siguiente
                        {
                            StrCodigoMaterialASumar = DtEntradaMateriales.Rows[IntFilaActualASumar][0].ToString().Substring(0, 6);//FJRF - Extraemos el codigo del material
                            StrCodigoColorASumar = DtEntradaMateriales.Rows[IntFilaActualASumar][0].ToString().Substring(6, 4);//FJRF - Extraemos el codigo del color

                            DblSumarCantidad = Double.Parse(DtEntradaMateriales.Rows[IntFilaActualASumar][4].ToString().Trim());//FJRF - Extraemos la cantidad
                            DblSumarCosto = Double.Parse(DtEntradaMateriales.Rows[IntFilaActualASumar][6].ToString().Trim());//FJRF - Extraemos el costo

                            DblTotalCantidad = DblTotalCantidad + DblSumarCantidad;//FJRF - Sumamos las cantidaddes
                            DblTotalCosto = DblTotalCosto + DblSumarCosto;//FJRF - Sumamos el costo
                        }
                    }
                    LblCantidad.Content = DblTotalCantidad;//FJRF - Asigamos la cantidad
                    LblCantidad.ContentStringFormat = "{0:##,#0.##}";//FJRF - Establecemos un formato

                    LblCosto.Content = DblTotalCosto;//FJRF - Asigamos la costo
                    LblCosto.ContentStringFormat = "{0:##,#0.##}";//FJRF - Establecemos un formato
                }
                else//FJRF - Si no tiene datos hacemos lo siguiente
                {
                    LblCantidad.Content = "0";//FJRF - Ponemos un valos por defecto
                    LblCosto.Content = "0";//FJRF - Ponemos un valos por defecto
                }
            }
        }
        private void BtnNuevo_Click(object sender, RoutedEventArgs e)
        {
            PrivV_Nuevo();
            CboTipo.SelectedIndex = 0;//FJRF - Ponemos el tipo en la primera posicion
        }
        private void PrivV_Nuevo()
        {
            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal - (En caso de que se quede asi por algun error inesperado)

            TxtNumeroConsecutivo.Text = "";//FJRF - Ponemos un valor por defecto
            PrivV_Limpiar();//FJRF - Limpiamos los datos

            PttV_NuevoConsecutivo();//FJRF - Ponemos el nuevo consecutivo dependiendo los parametros seleccionados

            CboCodigoProveedor.Focus();//FJRF - Ponemos el foco en el codigo del proveedor
        }
        private void PrivV_Limpiar()
        {
            TxtBuscarMaterialDelPedidoSeleccionado.Visibility = Visibility.Hidden;//FJRF - Ocultamos el objeto de busquedas
            TxtBuscarMaterialDelPedidoSeleccionado.Text = "";//FJRF - Limpiamos el pedido seleccionado

            LblTituloPedidoSeleccionado.Content = "";//FJRF - Limpiamos el pedido seleccionado
            LblNumeroPedidoSeleccionado.Content = "";//FJRF - Limpiamos el pedido seleccionado

            TxtConcepto.Text = "";//FJRF - Ponemos un valor por defecto
            TxtDocumentoReferencia.Text = "";//FJRF - Limpiamos el codocumento de referencia
            TxtNombreMateriaPrima.Text = "";//FJRF - Limpiamos el texto de busquedas de materia prima

            #region FJRF - LimpiamosLosGridSiCambianDeProveedor
            if (DtgPedidos.Items.Count > 0)
            {
                DtgPedidos.ItemsSource = null;
                DtgPedidos.Items.Clear();//FJRF - Limpiamos el grid de pedidos
            }
            if (DtgMateriales.Items.Count > 0)
            {
                DtgMateriales.ItemsSource = null;
                DtgMateriales.Items.Clear();//FJRF - Limpiamos el grid de materiales
            }
            if (DtEntradaMateriales == null)//FJRF - Si es null hacemos lo siguiente
            {
                //FJRF - Por el momento no hacemos nada
            }
            else
            {
                if (DtEntradaMateriales.Rows.Count > 0)
                {
                    DtEntradaMateriales.Rows.Clear();//FJRF - Limpiamos el grid de entradas de materiales
                    DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;//FJRF - Refrescamos la vista
                }
            }
            #endregion

            DtpFechaEntrada.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema

            StrNroPedidoActual = "";//FJRF - Limpiamos las variables genericas
            StrNroPedidoAnterior = "";//FJRF - Limpiamos las variables genericas
            StrCodigoReferenciaActual = "";//FJRF - Limpiamos las variables genericas
            StrCodigoReferenciaAnterior = "";//FJRF - Limpiamos las variables genericas

            BtnGuardar.IsEnabled = true;//FJRF - Habilitamos el guardar
            butImp.IsEnabled = false;//FJRF - Quitamos la impresión del reporte

            CboCodigoProveedor.SelectedIndex = -1;//FJRF - Quitamos cualquier selección
            CboAlmecenes.SelectedIndex = 0;//FJRF - Ponemos el codigo del almacen en la primera posicion

            PttV_SumarCantidadYCosto();//FJRF - Sumamos la cantidad y costo ingresado
        }
        private void BtnBuscarMateriaPrima_Click(object sender, RoutedEventArgs e)
        {
            if (StrVerificamosSiSePuedeSeguir() == "SI")//FJRF - Si todos los datos estan bien para seguir hacemos lo siguiente
            {
                PrivV_BuscarMateriaPrima();
            }
            else//FJRF - Si no se puede grabar hacemos lo siguiente
            {
                Msgbox("ADVERTENCIA !!!", StrVerificamosSiSePuedeSeguir(), MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Informamos el motivo de porque no se puede seguir
            }
        }
        private void TxtNombreMateriaPrima_KeyDown(object sender, KeyEventArgs e)
        {
            if (StrVerificamosSiSePuedeSeguir() == "SI")//FJRF - Si todos los datos estan bien para seguir hacemos lo siguiente
            {
                if (e.Key == Key.Enter)//FJRF - Si se presiona alguna de esta tecla hacemos lo siguiente
                {
                    if (TxtNombreMateriaPrima.Text.Trim() != "")//FJRF - Si se tienen datos hacemos lo siguiente
                    {
                        PrivV_BuscarMateriaPrima();
                    }
                }
                if (e.Key == Key.F2)//FJRF - Si se presiona alguna de esta tecla hacemos lo siguiente
                {
                    PrivV_BuscarMateriaPrima();
                }
            }
            else//FJRF - Si no se puede grabar hacemos lo siguiente
            {
                Msgbox("ADVERTENCIA !!!", StrVerificamosSiSePuedeSeguir(), MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Informamos el motivo de porque no se puede seguir
            }
        }

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        //FJRF - Con esta funcion cargamos los combos (Cargar combos)
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath;//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath;//FJRF - Decimos cual dato se mostrara

                CboComboACargar.Text = "";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        private void CboCodigoProveedor_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            CboNombreProveedor.SelectedIndex = CboCodigoProveedor.SelectedIndex;//FJRF - Igualamos los datos del codigo con el del nombre
            PrivVCargarGrid();//FJRF - Cargamos el grid
        }
        private void CboNombreProveedor_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            CboCodigoProveedor.SelectedIndex = CboNombreProveedor.SelectedIndex;//FJRF - Igualamos los datos del codigo con el del nombre
            PrivVCargarGrid();//FJRF - Cargamos el grid
        }
        private void CboTipo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            PttV_NuevoConsecutivo();//FJRF - Ponemos el nuevo consecutivo dependiendo los parametros seleccionados

            TxtBuscarMaterialDelPedidoSeleccionado.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto de ayuda de busquedas

            if (CboTipo.SelectedIndex == 0)//FJRF - Si el tipo es normal hacemos lo siguiente
            {
                #region FJRF - MovemosLosObjetosEnSuPosicionOriginal

                BtnBuscarMaterialPorPedido.Visibility = Visibility.Visible;//FJRF - Ponemos visible el objeto de ayuda de busquedas

                LblTitulosPedidos.Visibility = Visibility.Visible;//FJRF - Ponemos visible el objeto
                DtgPedidos.Visibility = Visibility.Visible;//FJRF - Ponemos visible el objeto

                LblTituloMateriales.Visibility = Visibility.Visible;//FJRF - Ponemos visible el objeto
                DtgMateriales.Visibility = Visibility.Visible;//FJRF - Ponemos visible el objeto

                Grid.SetRow(LblTituloMateriaPrima, 3);//FJRF - Decimos en que seccion debe de estar
                LblTituloMateriaPrima.Margin = new Thickness(22, 11, 0, 0);//FJRF - Establece las margenes originales

                Grid.SetRow(TxtNombreMateriaPrima, 3);//FJRF - Decimos en que seccion debe de estar
                TxtNombreMateriaPrima.Margin = new Thickness(127, 11, 0, 0);//FJRF - Establece las margenes originales

                Grid.SetRow(BtnBuscarMateriaPrima, 3);//FJRF - Decimos en que seccion debe de estar
                BtnBuscarMateriaPrima.Margin = new Thickness(427, 9, 0, 0);//FJRF - Establece las margenes originales

                Grid.SetRow(DtgEntradaMateriaPrima, 3);//FJRF - Decimos en que seccion debe de estar
                DtgEntradaMateriaPrima.Height = 146;//FJRF - Establecemos el alto del grid

                //FJRF - Redefinimos las margenes horizontales del grid
                RowDefinition Rd = new RowDefinition();
                Rd.Height = new GridLength(230);
                Row2.Height = Rd.Height;
                Rd.Height = new GridLength(223);
                Row3.Height = Rd.Height;
                #endregion
            }
            else//Si es devolucion hacemos lo siguiente
            {
                #region FJRF - MovemosLosObjetosDePosicion

                BtnBuscarMaterialPorPedido.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto de ayuda de busquedas

                LblTitulosPedidos.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto
                DtgPedidos.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto

                LblTituloMateriales.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto
                DtgMateriales.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto

                Grid.SetRow(LblTituloMateriaPrima, 2);//FJRF - Decimos en que seccion debe de estar
                LblTituloMateriaPrima.Margin = new Thickness(22, 5, 0, 0);//FJRF - Movemos de posicion el objeto

                Grid.SetRow(TxtNombreMateriaPrima, 2);//FJRF - Decimos en que seccion debe de estar
                TxtNombreMateriaPrima.Margin = new Thickness(126, 5, 0, 0);//FJRF - Movemos de posicion el objeto

                Grid.SetRow(BtnBuscarMateriaPrima, 2);//FJRF - Decimos en que seccion debe de estar
                BtnBuscarMateriaPrima.Margin = new Thickness(435, 3, 0, 413);//FJRF - Movemos de posicion el objeto

                Grid.SetRow(DtgEntradaMateriaPrima, 2);//FJRF - Decimos en que seccion debe de estar
                DtgEntradaMateriaPrima.Height = 380;//FJRF - Establecemos el alto del grid

                //FJRF - Redefinimos las margenes horizontales del grid
                RowDefinition Rd = new RowDefinition();
                Rd.Height = new GridLength(451);
                Row2.Height = Rd.Height;
                Rd.Height = new GridLength(2);
                Row3.Height = Rd.Height;
                #endregion
            }
        }
        protected void PttV_NuevoConsecutivo()
        {
            string strTemporal, strPrefijoConsecutivoActual, strConsecutivoActual, strConsecutivoNuevo, strConsecutivoArmado;//FJRF - Creamos la variables tipo string
            int IntConsecutivoActual, IntConsecutivoNuevo;//FJRF - Creamos las variables numericas

            strTemporal = CboTipo.Items[CboTipo.SelectedIndex].ToString().Replace("System.Windows.Controls.ComboBoxItem: ", "");//FJRF - Traemos la informacion del combo
            StrTipo = strTemporal.Substring(0, 3);//FJRF - Extraemos los tres primero caracteres del nombre

            StrTipoEntrada = StrTipo.Substring(0, 1).ToUpper();

            DtConsulta = new DataTable();
            StrConsulta = "select id_con, cod_con, nom_con, des_con from controlp where id_con='ENT' and cod_con='" + StrTipo + "' order by ID_CON, NOM_CON ";
            DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Realizamos la consulta y retornamos los datos

            strConsecutivoActual = DtConsulta.Rows[0][2].ToString();//FJRF - Traemos el consecutivo actual

            strPrefijoConsecutivoActual = strConsecutivoActual.Substring(0, 2);//FJRF - Separamos el prefijo del consecutivo
            IntConsecutivoActual = int.Parse(strConsecutivoActual.Substring(2, 5));//FJRF - Separamos el numero

            IntConsecutivoNuevo = IntConsecutivoActual + 1;//FJRF - Le sumamos uno a el consecutivo actual
            strConsecutivoArmado = IntConsecutivoNuevo.ToString();//FJRF - Convertimos el nuevo consecutivo a string para armarlo
            while (strConsecutivoArmado.Length < 5)//FJRF - Recerremos el consecutivo hasta un maximo de 5 caracteres
            {
                strConsecutivoArmado = "0" + strConsecutivoArmado;//FJRF - Le agregamos un cero adelante
            }
            strConsecutivoNuevo = strPrefijoConsecutivoActual + strConsecutivoArmado;//FJRF - Armamos el consecutivo con el prefijo
            TxtNumeroConsecutivo.Text = strConsecutivoNuevo;//FJRF - Visualizamos el consecutivo

            if (PrivBoo_BuscarEntrada(TxtNumeroConsecutivo.Text.Trim()) == true)
            {
                Msgbox("INFORMACIÓN IMPORTANTE", "La entrada número (" + TxtNumeroConsecutivo.Text.Trim() + ") ya existe, por favor informar al administrador del sistema para que verifique esta información", MessageBoxButton.OK, MessageBoxImage.Stop);
                BtnGuardar.IsEnabled = false;
                butImp.IsEnabled = true;//FJRF - Imprimimos el reporte
            }
        }

        #region FJRF - MsgboxPersonalizado
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        #region FJRF - ParaRetornarElValorDeUnaCeldaDeUnDataGrid
        private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
        {
            string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

            DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar

            if (row == null)
            {
                strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
            }
            else
            {
                TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

                if (cellContent == null)
                {
                    strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
                }
                else
                {
                    strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto
                }
            }
            return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
        }
        #endregion

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        private void BtnGuardar_Click(object sender, RoutedEventArgs e)
        {
            if (PrivBoo_BuscarEntrada(TxtNumeroConsecutivo.Text.Trim()) == true)
            {
                Msgbox("INFORMACIÓN IMPORTANTE", "La entrada número (" + TxtNumeroConsecutivo.Text.Trim() + ") ya existe, por favor informar al administrador del sistema para que verifique esta información", MessageBoxButton.OK, MessageBoxImage.Stop);
                BtnGuardar.IsEnabled = false;
                butImp.IsEnabled = true;//FJRF - Imprimimos el reporte
            }
            else
            {
                if (StrVerificamosSiSePuedeGrabar() == "SI")//FJRF - Si todos los datos estan bien para grabar hacemos lo siguiente
                {
                    #region FJRF - PreguntamosSiQueremosGuardar
                    String StrCaptionBox = "Confirmation";
                    String StrMensajeBox = "Esta seguro de guardar la entrada de materiales?";
                    MessageBoxButton buttons = MessageBoxButton.YesNo;
                    MessageBoxImage icon = MessageBoxImage.Question;
                    #endregion

                    if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Si el usuario quiere guardar hacemos lo siguiente
                    {
                        try
                        {
                            Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

                            String StrConsultaSqlInsert = "", StrConsultaSqlUpdate = "";//FJRF - Creamos las variables que necesitamos para el informe

                            #region FJRF - GuardamosLosDatosDelEncabezadoDeLaEntrada
                            //FJRF - VARIABLES CAMPOS A GUARDAR EN EL ENCABEZADO
                            String StrTIPENT_EEN, StrHOJNRO_EEN, StrCODALM_EEN, StrCONCEP_EEN, StrCODPRV_EEN, StrDOCREF_EEN;
                            DateTime DtmFECENT_EEN;
                            Int32 Int32NROPED_EEN;

                            StrTIPENT_EEN = StrTipoEntrada;//FJRF - Tipo de entrada (N o D)
                            StrHOJNRO_EEN = TxtNumeroConsecutivo.Text.Trim();//FJRF - Numero de hoja
                            DtmFECENT_EEN = DtpFechaEntrada.SelectedDate.Value;//FJRF - Fecha seleccionada
                            StrCODALM_EEN = CboAlmecenes.SelectedValue.ToString();//FJRF - Codigo del almacen
                            StrCONCEP_EEN = TxtConcepto.Text;//FJRF - Concepto
                            StrCODPRV_EEN = CboCodigoProveedor.SelectedValue.ToString();//FJRF - Codigo proveedor
                            StrDOCREF_EEN = TxtDocumentoReferencia.Text;//FJRF - Factura

                            if (String.IsNullOrEmpty(StrNroPedidoActual.Trim()) == true)
                            {
                                StrNroPedidoActual = "0";
                            }
                            Int32NROPED_EEN = Int32.Parse(StrNroPedidoActual.Trim());//FJRF - Se modifica el dia (26/01/2015) a peticion de Diana Londoño

                            //FJRF - Creamos la consulta que guarda los datos
                            StrConsultaSqlInsert = "INSERT INTO ENCENTP (TIPENT_EEN, HOJNRO_EEN, FECENT_EEN, CODALM_EEN, CONCEP_EEN, CODPRV_EEN, DOCREF_EEN, NROPED_EEN) ";
                            StrConsultaSqlInsert = StrConsultaSqlInsert + "VALUES ('" + StrTIPENT_EEN + "', '" + StrHOJNRO_EEN + "', '" + DtmFECENT_EEN.ToShortDateString() + "', '" + StrCODALM_EEN + "', '" + StrCONCEP_EEN + "', '" + StrCODPRV_EEN + "', '" + StrDOCREF_EEN + "', " + Int32NROPED_EEN + ") ";

                            MdoGeneral.comando(StrConsultaSqlInsert);
                            #endregion

                            #region FJRF - GuardamosLosDatosDelDetalleDeLaEntrada
                            String StrTIPENT_DEN, StrHOJNRO_DEN, StrCODMAT_DEN, StrCODCOL_DEN, StrNROORDP_DEN;
                            Double DblCANPRO_DEN, DblCOSPRO_DEN;

                            StrTIPENT_DEN = StrTipoEntrada;//FJRF - Tipo de entrada
                            StrHOJNRO_DEN = TxtNumeroConsecutivo.Text.Trim();//FJRF - Numero de hoja

                            StrNROORDP_DEN = "0";//FJRF - Aplica para las devoluciones

                            for (int IntFilaActual = 0; IntFilaActual < DtEntradaMateriales.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                            {
                                DblCANPRO_DEN = Double.Parse(DtEntradaMateriales.Rows[IntFilaActual][4].ToString().Trim());
                                if (DblCANPRO_DEN > 0)
                                {
                                    StrCODMAT_DEN = DtEntradaMateriales.Rows[IntFilaActual][0].ToString().Substring(0, 6);
                                    StrCODCOL_DEN = DtEntradaMateriales.Rows[IntFilaActual][0].ToString().Substring(6, 4);

                                    DblCANPRO_DEN = Double.Parse(DtEntradaMateriales.Rows[IntFilaActual][4].ToString().Trim());
                                    DblCOSPRO_DEN = Double.Parse(DtEntradaMateriales.Rows[IntFilaActual][5].ToString().Trim());

                                    StrConsultaSqlInsert = "INSERT INTO DETENTP (TIPENT_DEN,  HOJNRO_DEN,  CODMAT_DEN,  CODCOL_DEN,  CANPRO_DEN,  COSPRO_DEN,  NROORDP_DEN) ";
                                    StrConsultaSqlInsert = StrConsultaSqlInsert + "VALUES ('" + StrTIPENT_DEN + "', '" + StrHOJNRO_DEN + "', '" + StrCODMAT_DEN + "', '" + StrCODCOL_DEN + "', " + DblCANPRO_DEN.ToString().Replace(",", ".") + ", " + DblCOSPRO_DEN.ToString().Replace(",", ".") + ", '" + StrNROORDP_DEN + "') ";

                                    MdoGeneral.comando(StrConsultaSqlInsert);
                                }
                            }
                            #endregion

                            #region FJRF - ActualizamosElNumeroDeConsecutivo
                            StrConsultaSqlUpdate = "UPDATE controlp SET nom_con = '" + StrHOJNRO_EEN + "' where id_con='ENT' and cod_con='" + StrTipo + "' ";
                            MdoGeneral.comando(StrConsultaSqlUpdate.ToUpper());
                            #endregion

                            EjecutarSp_PROENTP(StrTIPENT_EEN, StrHOJNRO_EEN);//FJRF - Actualizamos el inventario
                            string StrProcesoGuardado = MDOgeneral.spComando.Parameters["pva_result"].Value.ToString();
                            if (StrProcesoGuardado == "S")//FJRF - Si el sp se ejecuto correctamente hacemos lo siguiente
                            {
                                #region FJRF - InformamosQueSeGuardaronLosDatosConExito
                                StrCaptionBox = "PROCESO EJECUTADO CON EXITO";
                                StrMensajeBox = "Se guardo la entrada de material (" + TxtNumeroConsecutivo.Text + ") del documento (" + TxtDocumentoReferencia.Text + ") con exito.";
                                Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Information);
                                #endregion

                                BtnGuardar.IsEnabled = false;//FJRF - Como ya esta guardado evitamos q guarden de nuevo inhabilitado el botón
                                butImp.IsEnabled = true;//FJRF - Imprimimos el reporte

                                PttV_Imprimir();//FJRF - Imprimimos reporte
                            }
                            else//FJRF - Si el sp no se ejecuto correctamente hacemos lo siguiente
                            {
                                Msgbox("PROCESO CANCELADO", "No se guardaron los datos... consulte con el administrador del sistema", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Informamos el motivo de porque no se puede guardar
                            }

                            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                        }
                        catch (Exception ex)
                        {
                            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                            MessageBox.Show(ex.Message);//FJRF - Si se genera un error informamos al usuario que paso
                        }
                    }
                    else//FJRF - Si el usuario no quieres guardar hacemos lo siguiente
                    {
                        MessageBoxResult result = MessageBox.Show("No se grabo la entrada (" + TxtNumeroConsecutivo.Text + ") del documento (" + TxtDocumentoReferencia.Text + ")", "PROCESO CANCELADO");//FJRF - Enviamos mensaje de cancelación
                    }
                }
                else//FJRF - Si no se puede grabar hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", StrVerificamosSiSePuedeGrabar(), MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Informamos el motivo de porque no se puede guardar
                }
            }
        }
        private void EjecutarSp_PROENTP(string strTipoEntrada, string strNumeroEntrada)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_PROENTP";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_tipent", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strTipoEntrada) ? "" : strTipoEntrada;
                MDOgeneral.spComando.Parameters.Add("pva_hojnro", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strNumeroEntrada) ? "" : strNumeroEntrada;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }

        private String StrVerificamosSiSePuedeSeguir()
        {
            String StrSePuedeSeguir = "SI";
            if (TxtNumeroConsecutivo.Text.Trim() == "")
            {
                StrSePuedeSeguir = "Falta digitar " + LblTituloNumeroConsecutivo.Content;
            }
            if (TxtNumeroConsecutivo.Text.Trim().Length < 7)
            {
                StrSePuedeSeguir = "El " + LblTituloNumeroConsecutivo.Content + " (" + TxtNumeroConsecutivo.Text.Trim() + ") debe tener un maximo de 7 caracteres y actualmente es de (" + TxtNumeroConsecutivo.Text.Trim().Length + ") caracteres";
            }
            if (TxtDocumentoReferencia.Text.Trim() == "")
            {
                StrSePuedeSeguir = "Falta digitar " + LblTituloDocumentoReferencia.Content;
            }
            if (TxtConcepto.Text.Trim() == "")
            {
                StrSePuedeSeguir = "Falta digitar " + LblTituloConcepto.Content;
            }
            if (CboCodigoProveedor.Text.Trim() == "" || CboCodigoProveedor.SelectedIndex == -1)
            {
                StrSePuedeSeguir = "Falta seleccionar el proveedor ";
            }

            return StrSePuedeSeguir;
        }

        private String StrVerificamosSiSePuedeGrabar()
        {
            String StrSePuedeGrabar = "SI";
            if (TxtNumeroConsecutivo.Text.Trim() == "")
            {
                StrSePuedeGrabar = "Falta digitar " + LblTituloNumeroConsecutivo.Content;
            }
            if (TxtNumeroConsecutivo.Text.Trim().Length < 7)
            {
                StrSePuedeGrabar = "El " + LblTituloNumeroConsecutivo.Content + " (" + TxtNumeroConsecutivo.Text.Trim() + ") debe tener un maximo de 7 caracteres y actualmente es de (" + TxtNumeroConsecutivo.Text.Trim().Length + ") caracteres";
            }
            if (TxtDocumentoReferencia.Text.Trim() == "")
            {
                StrSePuedeGrabar = "Falta digitar " + LblTituloDocumentoReferencia.Content;
            }
            if (TxtConcepto.Text.Trim() == "")
            {
                StrSePuedeGrabar = "Falta digitar " + LblTituloConcepto.Content;
            }
            if (DtgEntradaMateriaPrima.Items.Count <= 0)
            {
                StrSePuedeGrabar = "No ha ingresado materias primas ";
            }
            if (CboCodigoProveedor.Text.Trim() == "" || CboCodigoProveedor.SelectedIndex == -1)
            {
                StrSePuedeGrabar = "Falta seleccionar el proveedor ";
            }

            Boolean BooDatoEncontrado = false;//FJRF - Creamos una variable para saber si vamos a encontrar un dato y la cargamos por defecto en falso
            String StrCantidad = "", StrCodigoReferenciaAnterior1 = "", StrCodigoReferenciaActual1 = "";
            int IntCantidad;

            if (DtgEntradaMateriaPrima.Items.Count > 0)//FJRF - Si la consulta tiene datos hacemos lo siguiente
            {
                foreach (var FilaGridOriginal in DtgEntradaMateriaPrima.Items)//FJRF - Recorremos el grid
                {
                    StrCodigoReferenciaActual1 = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGridOriginal, 0);//FJRF - Extraemos la referencia anterior

                    IntCantidad = 0;

                    foreach (var FilaGrid in DtgEntradaMateriaPrima.Items)//FJRF - Recorremos el grid
                    {
                        StrCodigoReferenciaAnterior1 = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGrid, 0);//FJRF - Extraemos la referencia anterior
                        StrCantidad = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGrid, 4);//FJRF - Extraemos la referencia anterior
                        if (String.IsNullOrEmpty(StrCodigoReferenciaAnterior1) == false)//FJRF - Si la referencia tiene datos hacemos lo siguiente
                        {
                            if (StrCodigoReferenciaActual1 == StrCodigoReferenciaAnterior1)//FJRF - Si la refencia anterior es igual a la actual hacemos lo siguiente
                            {
                                IntCantidad++;

                                if (IntCantidad > 1)
                                {
                                    if (StrCantidad != "0")
                                    {
                                        BooDatoEncontrado = true;//FJRF - Informamos al sistema q si encontramos un dato
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (BooDatoEncontrado == true)
            {
                StrSePuedeGrabar = "Existe un dato repetido, con cantidad mayor a cero";
            }

            return StrSePuedeGrabar;
        }
        private void TxtNumeroConsecutivo_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (PrivBoo_BuscarEntrada(TxtNumeroConsecutivo.Text.Trim()) == false)
            {
                PrivV_Limpiar();//FJRF - Limpiamos los datos
                TxtNumeroConsecutivo.Focus();
            }
        }
        private Boolean PrivBoo_BuscarEntrada(String StrCodigoEntradaODevolucion)
        {
            Boolean BooExisteElDato = false;
            if (TxtNumeroConsecutivo.Text.Trim().Length == 7)
            {
                String StrDatoTemporal = "";//FJRF - Creamos una variable temporal por si algun dato quiere algun proceso

                #region FJRF - BuscamosLaEntradaEnElEncabezado
                DataTable DtEncabezado = new DataTable();//FJRF - Creamos la tabla que manejara el encabezado
                StrConsulta = "SELECT * FROM ENCENTP WHERE HOJNRO_EEN = '" + StrCodigoEntradaODevolucion + "'";//FJRF - Creamos la consulta
                DtEncabezado = MdoGeneral.consulta(StrConsulta);//FJRF - Convertimos la consulta en registros

                if (DtEncabezado.Rows.Count > 0)//FJRF - Validamos que existan datos
                {
                    BooExisteElDato = true;//FJRF - Confirmamos que existan datos por si se quiere hacer algun tipo de proceso
                    BtnGuardar.IsEnabled = false;//FJRF - Ponemos el guardar inhabilitado pues no se puede modificar un dato guardado y se debe hacer antes de actualizar la fecha para poder hacer las respectivas validaciones

                    StrDatoTemporal = DtEncabezado.Rows[0][0].ToString();//FJRF - Traemos el dato de la base de datos
                    if (StrDatoTemporal == "N")//FJRF - Si el tipo es N hacemos lo siguiente
                    {
                        CboTipo.SelectedIndex = 0;//FJRF - Ponemos el datos en entrada
                    }
                    else//FJRF - Si es otro tipo de dato hacemos lo siguiente
                    {
                        CboTipo.SelectedIndex = 1;//FJRF - Ponemos el dato en devolucion
                    }
                    TxtNumeroConsecutivo.Text = DtEncabezado.Rows[0][1].ToString();//FJRF - Asignamos el dato encontrado en la consulta
                    DtpFechaEntrada.SelectedDate = DateTime.Parse(DtEncabezado.Rows[0][2].ToString());//FJRF - Asignamos el dato encontrado en la consulta
                    CboAlmecenes.SelectedValue = DtEncabezado.Rows[0][3].ToString();//FJRF - Asignamos el dato encontrado en la consulta
                    TxtConcepto.Text = DtEncabezado.Rows[0][4].ToString();//FJRF - Asignamos el dato encontrado en la consulta
                    CboCodigoProveedor.SelectedValue = DtEncabezado.Rows[0][5].ToString();//FJRF - Asignamos el dato encontrado en la consulta
                    TxtDocumentoReferencia.Text = DtEncabezado.Rows[0][6].ToString();//FJRF - Asignamos el dato encontrado en la consulta
                }
                #endregion
            }
            if (BooExisteElDato == true)//FJRF - Si existen datos hacer lo siguiente
            {
                #region FJRF - BuscamosLaEntradaEnElDetalle
                DataTable DtDetalle = new DataTable();//FJRF - Creamos la tabla que manejara el detalle
                StrConsulta = "SELECT (CODMAT_DEN || '' || CODCOL_DEN) AS CODIGOMATERIAL, NOMMAT_MAT AS NOMBREMATERIAL, UNICOM_MAT AS CODIGOUNIDAD, NOMUNI_EUN AS NOMBREUNIDAD, CANPRO_DEN AS CANTIDAD, COSPRO_DEN AS COSTO, (CANPRO_DEN * COSPRO_DEN) AS SUBTOTAL ";
                StrConsulta = StrConsulta + "FROM DETENTP, MAEMAT, encunip ";
                StrConsulta = StrConsulta + "WHERE HOJNRO_DEN = '" + StrCodigoEntradaODevolucion + "' ";
                StrConsulta = StrConsulta + "AND CODMAT_DEN = CODMAT_MAT ";
                StrConsulta = StrConsulta + "AND UNICOM_MAT = CODUNI_EUN ";
                DtDetalle = MdoGeneral.consulta(StrConsulta);//FJRF - Convertimos la consulta en registros

                DtEntradaMateriales = DtDetalle.Copy();//FJRF - Copiamos los datos al Dt que maneja los materiales ingresados
                DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;//FJRF - Actualizamos el grid para visualizar los datos
                #endregion

                butImp.IsEnabled = true;//FJRF - Imprimimos el reporte

                PttV_SumarCantidadYCosto();//FJRF - Sumamos la cantidad y costo ingresado

                TxtNumeroConsecutivo.Focus();
            }
            return BooExisteElDato;
        }

        private void butImp_Click(object sender, RoutedEventArgs e)
        {
            PttV_Imprimir();//FJRF - Imprimimos reporte
        }
        protected void PttV_Imprimir()
        {
            try
            {
                #region FJRF - CreamosElEncabezadoDelInforme
                DataTable DtENCENT = new DataTable();//FJRF - Creamos la tabla que manejara el encabezado
                StrConsulta = "SELECT ";
                StrConsulta = StrConsulta + "CASE WHEN TIPENT_EEN = 'N' THEN 'NORMAL' ";
                StrConsulta = StrConsulta + "ELSE ";
                StrConsulta = StrConsulta + "CASE WHEN TIPENT_EEN = 'D' THEN 'DEVOLUCION' ";
                StrConsulta = StrConsulta + "END ";
                StrConsulta = StrConsulta + "END ";
                StrConsulta = StrConsulta + "AS TIPO, ";
                StrConsulta = StrConsulta + "HOJNRO_EEN AS NUMERO, FECENT_EEN AS FECHA, DOCREF_EEN AS DOCREF, CODPRV_EEN AS CODPRV, NOMPRV_PRV AS PROVEEDOR, NROPED_EEN AS ORDPRO, CONCEP_EEN AS CONCEPTO ";
                StrConsulta = StrConsulta + "FROM ENCENTP, MAEPRVP ";
                StrConsulta = StrConsulta + "WHERE CODPRV_EEN = CODPRV_PRV ";
                StrConsulta = StrConsulta + "AND HOJNRO_EEN = '" + TxtNumeroConsecutivo.Text.Trim() + "' ";
                DtENCENT = MdoGeneral.consulta(StrConsulta);//FJRF - Convertimos la consulta en registros

                DtENCENT.Columns.Add("STREMPRESA", System.Type.GetType("System.String"));
                DtENCENT.Rows[0][DtENCENT.Columns.Count - 1] = MDOgeneral.strEmpresaImprime;

                DtENCENT.TableName = "ENCENT";//FJRF - Le asignamos un nombre a la tabla


                #endregion

                #region FJRF - CreamosElDetalleDelInforme
                DataTable DtDETENT = new DataTable();//FJRF - Creamos la tabla que manejara el detalle
                StrConsulta = "SELECT ";
                StrConsulta = StrConsulta + "CODMAT_DEN || '' || CODCOL_DEN AS MATERIAPRIMA, HOJNRO_DEN AS ORDPRO , CODMAT_DEN AS CODIGO, NOMMAT_MAT AS DESCRIPCION, CODCOL_DEN AS CODCOL, NOMCOL_COL AS COLOR, CANPRO_DEN AS CANTIDAD, NOMUNI_EUN AS UNIDAD, COSPRO_DEN AS COSTO, (CANPRO_DEN * COSPRO_DEN) AS SUBTOTAL ";
                StrConsulta = StrConsulta + "FROM DETENTP, MAEMAT, encunip, MAECOLP ";
                StrConsulta = StrConsulta + "WHERE CODMAT_DEN = CODMAT_MAT ";
                StrConsulta = StrConsulta + "AND UNICOM_MAT = CODUNI_EUN ";
                StrConsulta = StrConsulta + "AND CODCOL_DEN = CODCOL_COL ";
                StrConsulta = StrConsulta + "AND HOJNRO_DEN = '" + TxtNumeroConsecutivo.Text.Trim() + "' ";
                StrConsulta = StrConsulta + "ORDER BY HOJNRO_DEN, NOMMAT_MAT, NOMCOL_COL ";
                DtDETENT = MdoGeneral.consulta(StrConsulta);//FJRF - Convertimos la consulta en registros
                DtDETENT.TableName = "DETENT";//FJRF - Le asignamos un nombre a la tabla
                #endregion

                #region FJRF - LlamamosElInformeEnCrystalReport
                DataSet ds = new DataSet("dsRentMatPri");
                ds.Tables.Add(DtENCENT.Copy());
                ds.Tables.Add(DtDETENT.Copy());

                produccion.reportes.Vista frm = new produccion.reportes.Vista();
                frm.reporte = MDOgeneral.StrRutaAplicacionReportes + "repRentMatPri.rpt";
                frm.ds = ds;
                frm.Show();

                #endregion
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void TxtBuscarMaterialDelPedidoSeleccionado_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (StrNroPedidoActual.Trim().Length > 0)//FJRF - Si hay un pedido seleccionado hacemos lo siguiente
                {
                    if (TxtBuscarMaterialDelPedidoSeleccionado.Text.Trim() == "")
                    {
                        StrConsulta = "SELECT CODIGOREFERENCIA AS CODMAT,  NOMBREREREFENCIA AS MATERIAL,  CODIGOCOLOR AS CODCOL,  NOMBRECOLOR AS COLOR, CODIGOUNIDAD AS CODUNI, NOMBREUNIDAD AS UNIDAD,  PEDIDO,  RECIBIDO,  DESPACHADO AS DESCARTADO,  PENDIENTE ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "FROM VIS_PEDPEN ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE NUMEROPEDIDO = '" + StrNroPedidoActual + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODIGOPROVEEDOR = '" + CboCodigoProveedor.SelectedValue + "' ";//FJRF - Armamos la consulta
                    }
                    else
                    {
                        StrConsulta = "SELECT CODIGOREFERENCIA AS CODMAT,  NOMBREREREFENCIA AS MATERIAL,  CODIGOCOLOR AS CODCOL,  NOMBRECOLOR AS COLOR, CODIGOUNIDAD AS CODUNI, NOMBREUNIDAD AS UNIDAD,  PEDIDO,  RECIBIDO,  DESPACHADO AS DESCARTADO,  PENDIENTE ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "FROM VIS_PEDPEN ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE NUMEROPEDIDO = '" + StrNroPedidoActual + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODIGOPROVEEDOR = '" + CboCodigoProveedor.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND NOMBREREREFENCIA LIKE '%" + TxtBuscarMaterialDelPedidoSeleccionado.Text.Trim() + "%' ";//FJRF - Armamos la consulta
                    }

                    DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

                    DtgMateriales.ItemsSource = DtConsulta.DefaultView;
                }
                if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                {
                    DtgMateriales.Focus();
                    DtgMateriales.CurrentCell = new DataGridCellInfo(DtgMateriales.Items[0], DtgMateriales.Columns[0]);//FJRF - Decimos en que fila y columna vamos a trabajar
                }
                else//FJRF - Si no hay datos hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El material buscado [ " + TxtBuscarMaterialDelPedidoSeleccionado.Text.Trim() + " ] no existe ",MessageBoxButton.OK,MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                }
            }
        }

        private void CboCodigoProveedor_KeyDown(object sender, KeyEventArgs e)
        {
            if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.F12)//FJRF - Si presionan la tecla control (Ctrl) mas la letra (F12) de proveedores entonces hacemos lo siguiente
            {
                CboCodigoProveedor.Visibility = Visibility.Hidden;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                CboNombreProveedor.Visibility = Visibility.Hidden;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

                String StrDatoRetornado = StrCargarAyudasGenericasProveedores("CODIGO");//FJRF - Cargamos la ayuda generica de los proveedores

                if (String.IsNullOrEmpty(StrDatoRetornado) == false)//FJRF - Si trae algun dato hacemos lo siguiente
                {
                    string strDato = "";
                    int IntPosicion = 0;
                    foreach (var item in CboCodigoProveedor.Items)
                    {
                        strDato = ((DataRowView)item)[0].ToString();

                        if (strDato.ToUpper().Trim() == StrDatoRetornado.ToUpper().Trim())
                        {
                            break;
                        }
                        IntPosicion++;
                    }
                    CboCodigoProveedor.SelectedIndex = IntPosicion;

                    CboCodigoProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                    CboNombreProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

                    PrivVCargarGrid();//FJRF - Cargamos el grid

                    TxtDocumentoReferencia.Focus();
                }
                else//FJRF - Si no trae datos entonces hacemos lo siguiente
                {
                    CboCodigoProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                    CboNombreProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                    
                    CboCodigoProveedor.Focus();
                }
            }
            if (e.Key == Key.Enter)//FJRF - Si se presiona enter hacemos lo siguiente
            {
                CboNombreProveedor.Focus();
            }
        }
        private void CboNombreProveedor_KeyDown(object sender, KeyEventArgs e)
        {
            if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.F12)//FJRF - Si presionan la tecla control (Ctrl) mas la letra (F12) de proveedores entonces hacemos lo siguiente
            {
                CboCodigoProveedor.Visibility = Visibility.Hidden;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                CboNombreProveedor.Visibility = Visibility.Hidden;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

                String StrDatoRetornado = StrCargarAyudasGenericasProveedores("PROVEEDOR");//FJRF - Cargamos la ayuda generica de los proveedores

                if (String.IsNullOrEmpty(StrDatoRetornado) == false)//FJRF - Si trae algun dato hacemos lo siguiente
                {
                    string strDato = "";
                    int IntPosicion = 0;
                    foreach (var item in CboNombreProveedor.Items)
                    {
                        strDato = ((DataRowView)item)[1].ToString();

                        if (strDato.ToUpper().Trim() == StrDatoRetornado.ToUpper().Trim())
                        {
                            break;
                        }
                        IntPosicion++;
                    }
                    CboNombreProveedor.SelectedIndex = IntPosicion;

                    CboCodigoProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                    CboNombreProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

                    PrivVCargarGrid();//FJRF - Cargamos el grid

                    TxtDocumentoReferencia.Focus();
                }
                else//FJRF - Si no trae datos entonces hacemos lo siguiente
                {
                    CboCodigoProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                    CboNombreProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

                    CboNombreProveedor.Focus();
                }
            }
            if (e.Key == Key.Enter)//FJRF - Si se presiona enter hacemos lo siguiente
            {
                TxtDocumentoReferencia.Focus();
            }
        }
        private void BtnBuscarProveedor_Click(object sender, RoutedEventArgs e)
        {
            CboCodigoProveedor.Visibility = Visibility.Hidden;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
            CboNombreProveedor.Visibility = Visibility.Hidden;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

            String StrDatoRetornado = StrCargarAyudasGenericasProveedores("PROVEEDOR");//FJRF - Cargamos la ayuda generica de los proveedores

            if (String.IsNullOrEmpty(StrDatoRetornado) == false)//FJRF - Si trae algun dato hacemos lo siguiente
            {
                string strDato = "";
                int IntPosicion = 0;
                foreach (var item in CboNombreProveedor.Items)
                {
                    strDato = ((DataRowView)item)[1].ToString();

                    if (strDato.ToUpper().Trim() == StrDatoRetornado.ToUpper().Trim())
                    {
                        break;
                    }
                    IntPosicion++;
                }
                CboNombreProveedor.SelectedIndex = IntPosicion;

                CboCodigoProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
                CboNombreProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

                PrivVCargarGrid();//FJRF - Cargamos el grid

                TxtDocumentoReferencia.Focus();
            }

            CboCodigoProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)
            CboNombreProveedor.Visibility = Visibility.Visible;//FJRF - Ponemos visible el combo (Viene invisible por defecto para que pueda cargar los datos y no ejecute procesos mientras se carga el combo)

            CboNombreProveedor.Focus();
        }
        private String StrCargarAyudasGenericasProveedores(String StrDatoQueDebeRetornar)
        {
            String StrDatoRetornado = "";//FJRF - Variable para saber el dato retornado

            FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
            FrmAyudas.pStrTituloVentana_Opcional = "CONSULTA DE PROVEEDORES";//FJRF - Le enviamos un titulo personalizado al formulario

            StrConsulta = "SELECT ";//FJRF - Seleccionamos
            StrConsulta = StrConsulta + "UPPER(CODPRV_PRV) AS CODIGO,  UPPER(NOMPRV_PRV) AS PROVEEDOR,  NITPRV_PRV AS NIT,   UPPER(DIRPRV_PRV) AS DIRECCION,  UPPER(NOMCIU_CIU) AS CIUDAD,  TELPRV_PRV AS TELEFONO,  FAXPRV_PRV AS FAX,  UPPER(REPPRV_PRV) AS REPRESENTANTE,  UPPER(EMAIL_PRV) AS EMAIL ";//FJRF - Los campos
            StrConsulta = StrConsulta + "FROM MAEPRVP, MAECIU ";//FJRF - Las tablas
            StrConsulta = StrConsulta + "WHERE CODCIU_PRV = CODCIU_CIU AND ESTADO_PRV = 'A' ";//FJRF - Condicionamos la consulta
            StrConsulta = StrConsulta + "ORDER BY NOMPRV_PRV ";//FJRF - Ordenamos la información

            FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
            FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "CODIGO";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene

            FrmAyudas.pIntNumeroColumnasAInmovilizarGrid_Opcional = 2;//FJRF - Decimos que inmobilice las 2 primeras filas

            if (StrDatoQueDebeRetornar == "CODIGO")//FJRF - Decimos porque dato quiere buscar
            {
                FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "CODIGO";//FJRF - Asignamos el dato a buscar
            }
            else//FJRF - Si no es por codico entonces sera por proveedor en este caso
            {
                FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "PROVEEDOR";//FJRF - Asignamos el dato a buscar
            }
            
            FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario

            if (FrmAyudas.DtDatosRetornados == null)//FJRF - Si no trae nada hacemos lo siguiente
            {
                StrDatoRetornado = "";//FJRF - Retornamos vacio
            }
            else//FJRF - Si trae datos entonces hacemos lo siguiente
            {
                if (FrmAyudas.DtDatosRetornados.Rows.Count > 0)//FJRF - Si el objeto trae filas entonces hacemos lo siguiente
                {
                    StrDatoRetornado = FrmAyudas.DtDatosRetornados.Rows[0][StrDatoQueDebeRetornar].ToString();//FJRF - Buscamos el dato seleccionado;
                }
                else//FJRF - Si no es nulo pero no trae filas hacemos lo siguiente
                {
                    StrDatoRetornado = "";//FJRF - Retornamos vacio
                }
            }
            return StrDatoRetornado;////FJRF - Rerornamos el dato que se necesita
        }
        protected void PttV_VerColores()
        {
            FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
            FrmAyudas.pStrTituloVentana_Opcional = "CONSULTA DE COLORES";//FJRF - Le enviamos un titulo personalizado al formulario

            StrConsulta = "SELECT UPPER(CODCOL_COL) AS CODIGO, UPPER(NOMCOL_COL) AS COLOR FROM maecolp ORDER BY NOMCOL_COL ";//FJRF - Seleccionamos

            FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
            FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "CODIGO";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
            FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "CODIGO";//FJRF - Asignamos el dato a buscar
            FrmAyudas.pBooQuitarBotonRetornar_Opcional = true;//FJRF - Quitamos el boton de retornar datos

            FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario
        }
        private void CboTipo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si se presiona enter hacemos lo siguiente
            {
                TxtNumeroConsecutivo.Focus();//FJRF - Se pasa el foco a este objeto
            }
        }
        private void TxtNumeroConsecutivo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si se presiona enter hacemos lo siguiente
            {
                DtpFechaEntrada.Focus();//FJRF - Se pasa el foco a este objeto
            }
        }
        private void DtpFechaEntrada_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si se presiona enter hacemos lo siguiente
            {
                CboAlmecenes.Focus();//FJRF - Se pasa el foco a este objeto
            }
        }
        private void CboAlmecenes_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si se presiona enter hacemos lo siguiente
            {
                CboCodigoProveedor.Focus();//FJRF - Se pasa el foco a este objeto
            }
        }
        private void TxtDocumentoReferencia_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si se presiona enter hacemos lo siguiente
            {
                TxtConcepto.Focus();//FJRF - Se pasa el foco a este objeto
            }
        }

        private void BtnAyudaVerColores_Click(object sender, RoutedEventArgs e)
        {
            PttV_VerColores();//FJRF - Ver colores
        }

        private void DtgMateriales_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                String StrCodigoReferencia, StrNombreReferencia, StrReferencia, StrColor, StrCodigoUnidad, StrNombreUnidad, StrNombreColor;//FJRF - Creamos las variables necesarias para los materiales que sean tipo string
                Double DblCosto = 0, DblCantidadPendiente = 1;//FJRF - Creamos las variables necesarias para los materiales que sean tipo numerico y las inicializamos
                try
                {
                    if (DtgMateriales.SelectedItem == null)//FJRF - Si no hay materiales seleccionados hacemos lo siguiente
                        return;//FJRF - Nos salimos

                    DataRowView dr = DtgMateriales.SelectedItem as DataRowView;//FJRF - Creamos un DataRowView con el item seleccionado
                    DataRow dr1 = dr.Row;//FJRF - Cargamos las filas que tenga

                    StrReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan
                    StrColor = Convert.ToString(dr1.ItemArray[2]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    StrNombreColor = Convert.ToString(dr1.ItemArray[3]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    StrCodigoReferencia = StrReferencia + StrColor;//FJRF - Se arma la referencia con la referencia del material mas el color
                    StrNombreReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    DblCantidadPendiente = Double.Parse(Convert.ToString(dr1.ItemArray[9]));//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                    StrCodigoReferenciaActual = StrCodigoReferencia;//FJRF - Asignamos la referencia armada como referencia acutal

                    StrCodigoUnidad = Convert.ToString(dr1.ItemArray[4]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan
                    StrNombreUnidad = Convert.ToString(dr1.ItemArray[5]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan


                    DtConsulta = new DataTable();//FJRF - Creamos un nuevo manejador de consultas
                    StrConsulta = "SELECT CODMAT_MTP, NOMMAT_MAT, CODCOL_MTP, NOMCOL_COL, CODBAR_MTP, EXIMTP_MTP, CANSEP_MTP, FISICO_MTP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "FROM maemtp, MAEMAT, MAECOLP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "WHERE CODMAT_MAT = CODMAT_MTP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "AND CODCOL_COL = CODCOL_MTP ";//FJRF - Se arma la busqueda
                    StrConsulta = StrConsulta + "AND CODMAT_MTP = '" + StrReferencia + "' AND CODCOL_MTP = '" + StrColor + "' ";//FJRF - Se arma la busqueda
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos consultados atravez de una funcion

                    if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtConsulta = new DataTable();//FJRF - Creamos un nuevo manejador de consultas
                        StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '99' AND CODMAT_PMP = '" + StrReferencia + "' AND CODCOL_PMP = '" + StrColor + "'";//FJRF - Se arma la busqueda
                        DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos consultados atravez de una funcion

                        if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                        {
                            DblCosto = Double.Parse(DtConsulta.Rows[0][0].ToString());//FJRF - Cargamos el costo
                        }
                        else//FJRF - Si la consulta no trae datos hacemos lo siguiente
                        {
                            DblCosto = 0;//FJRF - Ponemos el costo en cero
                        }

                        Boolean BooDatoEncontrado = false;//FJRF - Creamos una variable para saber si vamos a encontrar un dato y la cargamos por defecto en falso
                        if (DtgEntradaMateriaPrima.Items.Count > 0)//FJRF - Si la consulta tiene datos hacemos lo siguiente
                        {
                            foreach (var FilaGrid in DtgEntradaMateriaPrima.Items)//FJRF - Recorremos el grid
                            {
                                StrCodigoReferenciaAnterior = ReturnDataGridCellText(DtgEntradaMateriaPrima, FilaGrid, 0);//FJRF - Extraemos la referencia anterior
                                if (String.IsNullOrEmpty(StrCodigoReferenciaAnterior) == false)//FJRF - Si la referencia tiene datos hacemos lo siguiente
                                {
                                    if (StrCodigoReferenciaActual == StrCodigoReferenciaAnterior)//FJRF - Si la refencia anterior es igual a la actual hacemos lo siguiente
                                    {
                                        BooDatoEncontrado = true;//FJRF - Informamos al sistema q si encontramos un dato
                                    }
                                }
                            }
                        }

                        if (BooDatoEncontrado == true)//FJRF - Si encontramos un dato hacemos lo siguiente
                        {
                            Msgbox("ADVERTENCIA", "Ya esta asignado el material : (" + StrCodigoReferenciaActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);//FJRF - Informamos al usuario
                        }
                        else//FJRF - Si no encontramos ningun dato hacemos lo siguiente
                        {
                            DrEntradaMateriales = DtEntradaMateriales.NewRow();//FJRF - Creamos una nueva fila

                            DrEntradaMateriales["CODIGOMATERIAL"] = StrCodigoReferencia;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["NOMBREMATERIAL"] = StrNombreReferencia + " - " + StrNombreColor;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["CODIGOUNIDAD"] = StrCodigoUnidad;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["NOMBREUNIDAD"] = StrNombreUnidad;//FJRF - Asignamos los datos a la nueva fila

                            //DrEntradaMateriales["CANTIDAD"] = DblCantidadPendiente;
                            DrEntradaMateriales["CANTIDAD"] = 0;//FJRF - Se quita la cantidad a peticion de Diana Londoño el dia [26/01/2015]

                            DrEntradaMateriales["COSTO"] = DblCosto;//FJRF - Asignamos los datos a la nueva fila
                            //DrEntradaMateriales["SUBTOTAL"] = DblCantidadPendiente * DblCosto;//FJRF - Asignamos los datos a la nueva fila
                            DrEntradaMateriales["SUBTOTAL"] = 0;//FJRF - Asignamos los datos a la nueva fila

                            DtEntradaMateriales.Rows.Add(DrEntradaMateriales);//FJRF - Adicionamos la nueva fila a la tabla

                            DtgEntradaMateriaPrima.ItemsSource = DtEntradaMateriales.DefaultView;//FJRF - Asignamos la tabla al grid

                            DtgEntradaMateriaPrima.Focus();//FJRF - Le enviamos el foco al objeto

                            int IntFilaIndexada1 = DtgEntradaMateriaPrima.Items.Count - 1;//FJRF - Capturamos la fila indexada que el la ultima que se pone en el grid
                            SelectCellByIndex(DtgEntradaMateriaPrima, IntFilaIndexada1, 4);//FJRF - Le decimos cual es la nueva posicion
                        }
                    }
                    else//FJRF - Si la consulta no trae datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "La referencia '" + StrReferencia + "' en color '" + StrReferencia + "' no se puede agregar porque no existe.", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                    }
                }
                catch (Exception ex)//FJRF - Si se presenta un error hacemos lo siguiente
                {
                    MessageBox.Show(ex.Message);//FJRF - Enviamos un mensaje al usuario
                }
            }
        }
        private void BtnBuscarMaterialPorPedido_Click(object sender, RoutedEventArgs e)
        {
            PttV_BuscarUnMaterialPorPedido();
        }
        protected void PttV_BuscarUnMaterialPorPedido()
        {
            FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
            FrmAyudas.pStrTituloVentana_Opcional = "CONSULTA DE MATERIALES POR PEDIDO";//FJRF - Le enviamos un titulo personalizado al formulario

            StrConsulta = "SELECT NROPED_EPP AS NUMEROPEDIDO, UPPER(CODIGOREFERENCIA || CODIGOCOLOR) AS CODIGO,  UPPER(NOMBREREREFENCIA) AS MATERIAL,  UPPER(NOMBRECOLOR) AS COLOR, FECPED_EPP AS FECHA, FECENT_EPP AS ENTREGA,  PEDIDO,  RECIBIDO,  DESPACHADO AS DESCARTADO,  PENDIENTE ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "FROM encpprp, VIS_PEDPEN ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "WHERE CODPRV_EPP = '" + CboCodigoProveedor.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND ESTPED_EPP = 'P' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODPRV_EPP = CODIGOPROVEEDOR ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND NROPED_EPP = NUMEROPEDIDO ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "ORDER BY  FECPED_EPP, NROPED_EPP ";//FJRF - Armamos la consulta

            FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
            FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "CODIGO";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
            FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "MATERIAL";//FJRF - Asignamos el dato a buscar
            FrmAyudas.pBooQuitarBotonRetornar_Opcional = true;//FJRF - Quitamos el boton de retornar datos
            FrmAyudas.pBooPonerBotonExportarExcel_Opcional = true;//FJRF - Activamos el boton para que se le permita la exportacion de datos a excel

            String StrColumnasParaFormato = "PEDIDO,  RECIBIDO,  DESCARTADO,  PENDIENTE ";//FJRF - Columnas para formato numerico
            FrmAyudas.pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional = StrColumnasParaFormato;//FJRF - Enviamos las columnas que se le van a hacer formato numerico

            FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario
        }

        private void BtnEntradasDeMateriales_Click(object sender, RoutedEventArgs e)
        {
            DateTime DttFechaDesde, DttFechaHasta;//FJRF - Creamos los manejadores de fechas
            DttFechaHasta = DateTime.Now;//FJRF - Decimos que la consulta es desde hoy
            DttFechaDesde = DttFechaHasta.AddYears(-1);//FJRF - hasta la misma fecha de hoy pero un año atras

            String StrCodigoProveedor;//FJRF - Variable para manejar el proveedor
            if (CboCodigoProveedor.SelectedValue == null)//FJRF - Si es nulo hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO", "No hay un proveedor seleccionado", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos el motivo de porque no se puede seguir
            }
            else//FJRF - Si tiene datos hacemos lo siguiente
            {
                StrCodigoProveedor = CboCodigoProveedor.SelectedValue.ToString();//FJRF - Asignamos el valor

                FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
                FrmAyudas.pStrTituloVentana_Opcional = "CONSULTA DE DETALLE ENTRADAS DE MATERIAL CON DETALLE DE PEDIDO RELACIONADO";//FJRF - Le enviamos un titulo personalizado al formulario

                StrConsulta = "SELECT NROPEDIDO,  CANPRO_DPP AS CANPRG,  CANREC_DPP AS CANREC,  CANDES_DPP AS CANDES, ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FECHAENTRADA,  CODIGOMATERIAL,  NOMBREMATERIAL,  CODIGOCOLOR,  NOMBRECOLOR, ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "PROGRAMADO,  COSTO,  VALORTOTAL, ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "HOJA,  DOCUMENTO,  CODIGOPROVEEDOR,  NOMBREPROVEEDOR,  CONCEPTO,  ORDEN, ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "CODIGOGRUPO,  NOMBREGRUPO,  CODIGOSUBGRUPO,  NOMBRESUBGRUPO, ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ENTRADA,  CODIGOALMACEN,  NOMBREALMACEN ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM VIS_DETENTP, DETPPRP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE  NROPEDIDO = NROPED_DPP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODIGOPROVEEDOR = CODPRV_DPP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODIGOMATERIAL = CODMAT_DPP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODIGOCOLOR = CODCOL_DPP ";//FJRF - Armamos la consulta

                StrConsulta = StrConsulta + "AND CODIGOPROVEEDOR = '" + StrCodigoProveedor + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND FECHAENTRADA BETWEEN ('" + DttFechaDesde.ToShortDateString() + "') AND ('" + DttFechaHasta.ToShortDateString() + "') ";//FJRF - Armamos la consulta

                StrConsulta = StrConsulta + "ORDER BY FECHAENTRADA DESC ";//FJRF - Armamos la consulta

                FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
                FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "HOJA";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
                FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "NOMBREMATERIAL";//FJRF - Asignamos el dato a buscar
                FrmAyudas.pBooQuitarBotonRetornar_Opcional = true;//FJRF - Quitamos el boton de retornar datos
                FrmAyudas.pBooPonerBotonExportarExcel_Opcional = true;//FJRF - Activamos el boton para que se le permita la exportacion de datos a excel

                String StrColumnasParaFormato = "CANPRG,  CANREC,  CANDES,  PROGRAMADO, COSTO, VALORTOTAL ";//FJRF - Columnas para formato numerico
                FrmAyudas.pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional = StrColumnasParaFormato;//FJRF - Enviamos las columnas que se le van a hacer formato numerico

                FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario
            }
        }
    }
}
